Laden...

DirectX Sprite texture ruckeln & ladezeit

Erstellt von Hammala vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.414 Views
Hammala Themenstarter:in
23 Beiträge seit 2006
vor 17 Jahren
DirectX Sprite texture ruckeln & ladezeit

Hallo,

ich bin gerade dabei ein 2D scrollup shooter zu programmieren.
Dabei bin ich nun auf ein Problem gestoßen, welches bisher leider nicht lösbar war.

Ich lade in meiner "InitTexture" class alle Texturen vor dem Spielstart.
Die Hintergründe für den shooter sind .jpg bilder im Format 1280x1024.
Und genau die Hintergründe verursachen die Probleme

Wärend dem Spielablauf gibt es immer größere Hänger oder gar Darstellungsfehler mit folgendem code um die Texturen zu laden:

this._texture = TextureLoader.FromFile(this._d3dRenderer.Device, pic, info.Width, info.Height, 0, Usage.None, info.Format, Pool.Managed, Filter.None, Filter.Linear, 0);

Änder ich den Code nun folgendermaßen ab, läuft alles wunderbar.

this._texture = new Texture(this._d3dRenderer.Device, new System.Drawing.Bitmap(pic), Usage.None, Pool.Managed);

Leider ist die Ladezeit fast 10 fach so hoch. Ist ja auch kein wunder, da ich ein neues Bitmap erstelle.
Wende ich folgende Abwandlung an:

this._texture = new Texture(this._d3dRenderer.Device, new System.Drawing.Bitmap(this.GetType(), pic), Usage.None, Pool.Managed);

ist die Ladezeit wieder um einiges besser, doch die Probleme tauchen erneut auf.

Sobald ein neues Hintergrundbild in des Bildschrim reinlaufen soll (von oben nach unten), gibt es diese Hänger, wie wenn er das Bild erneut laden müsste.
Nach dem 4ten hänger bleibt es für 2 sec kurz ganz stehen und das zu ladende Hintergrundtexture wird schwarz dargestellt.

Extrem fallen mir diese Probleme auf einer ATI9700(Mobile) und einer etwas älteren Geforce auf.

Auf der neuen GF7900GT fallen die hänger kaum auf, und Grafikfehler gibt es gar keine.

Ich habe schon verschieden varianten mit Pool.Default / Pool.Manages usw probiert.
Das D3DDevice erstelle ich folgender maßen:

 this._pp = new PresentParameters();
        this._pp.SwapEffect = SwapEffect.Discard;

        // Start op foll screen
        Format current = Manager.Adapters[0].CurrentDisplayMode.Format;

        if (Manager.CheckDeviceType(0, DeviceType.Hardware, current, current, false))
        {
          this._pp.Windowed = false;
          this._pp.BackBufferFormat = current;
          this._pp.BackBufferCount = 1;
          this._pp.BackBufferWidth = this._screenWidth;
          this._pp.BackBufferHeight = this._screenHeight;
          this._pp.PresentationInterval = PresentInterval.Immediate;
        }
        else
        {
        this._pp.Windowed = true;
        this._pp.PresentationInterval = PresentInterval.Immediate;
        this._initEngine.Gameform.Width = this._screenWidth;
        this._initEngine.Gameform.Height = this._screenHeight;
        this._initEngine.Gameform.ControlBox = false;
        }

        this._device = new Device(0, DeviceType.Hardware, this._initEngine.Gameform, CreateFlags.SoftwareVertexProcessing, this._pp);
        this._screenRectangle = new Rectangle(0, 0, this._screenWidth, this._screenHeight);

Ich hoffe einer hatte schon solche Probleme und kann mir einen Tipp geben.
Da ich zum ersten mal in Managed-DirectX programmiere, geht bitte von den dümmsten Fehlern aus 🙂

Und denne sprach die Henne.

B
1.529 Beiträge seit 2006
vor 17 Jahren

Kenne mich zwar mit DirectX nicht so gut aus, aber deine Beschreibung klingt so, als wenn die Texturen immer üder den AGP bzw. PCIe übertragen werden.
Versuch mal, die Texturen vor dem Spielstart in einen Puffer im lokalen Speicher der Grafikkarte abzulegen. Irgendwo hier im Forum habe ich dazu - glaube ich zumindest - schon mal was gelesen.

E
265 Beiträge seit 2004
vor 17 Jahren

Wegen den langen Ladezeiten, für jede 1280x1024x32 Bitmap lädst du 40MB in den speichern (system oder grafik, hängt vom Pool Parameter ab). Das kann dauern.
Bei einer/ersten Variante erstellst du eine komplette MipMap-Chain (miplevel parameter ist 0). Wenn ich das richtig verstanden habe ist ein MipLevel eine kleinere version der aktuellen Texture. Und bei einer kompletten mipmapchain müssten das einige texturen sein. 512x512, 256x256, 128x128, 64x64, 32x32 (und sicher noch ein paar andere größen) Dann kommen zu den 40MB sicherlich nochma 200 dazu. Außerdem filterst du auch noch die ganzen miplevel. Keine Ahnung wie schnell eine Lineare Filterung ist, aber die macht das ganze sicher auch nochmal langsamer.
So viel zur langen Ladezeit. Bitte um Korrektur falls ich was falsch erklärt habe.

Fehler Schwarze Hintergründe. Nach dem 3./4. Bild ist dein speicher schon so zugemüllt das DirectX wahrscheinlich das bild nicht mehr korrekt laden kann.

Hammala Themenstarter:in
23 Beiträge seit 2006
vor 17 Jahren

Danke, das klingt für mich durchaus logisch.

Also mach ein reinen Müll wie man so schön sagt 🙂
Leider ist mir das erst aufgefallen, nachdem ich es nicht auf einer highend Grafikkarte laufen lassen hab.

Ich habe nun MipMap auf 1 gesetzt und tada viel besser. Keine Hänger mehr 🙂
Danke für die Erklärung, nun ist mir das um einiges klarer geworden.

Wir würde ich nun am besten weiter vorgehen?

  • 1280x1024 in 256x256 Blöcke aufteilen und zeilenweise den Hintergrund damit tapezieren?
  • Oder gibts noch andere Möglichkeiten diese große Datenmenge zu optimieren?

Und denne sprach die Henne.

E
265 Beiträge seit 2004
vor 17 Jahren
  • 1280x1024 in 256x256 Blöcke aufteilen und zeilenweise den Hintergrund damit tapezieren?

So mach ich es zumindest. Wenn sich die texturen oft wiederholen ist diese variante speicher schonend.

Hammala Themenstarter:in
23 Beiträge seit 2006
vor 17 Jahren

Hmm, da ich leider das Bild als Hintergrund verwende, wiederholt sich das texture kaum.

Aber ich müsste mal überlegen den Hintergrund so zu stealten, dass er zusammensetzbar ist.

Ich glaube es dauert länger 20x 256x256 Pictures zu laden wie ein 1280x1024 oder (In Bezug auf es wiederholt sich kein texture in einem Screen)?

Wie gesagt, ich bin gerade erst am Anfang und freue mich daher über jeden Hinweis.

In meinem Buch das ich habe geht es leider nicht über den Einstieg hinaus. Und bezüglich 2D ist es auch sehr ungenügend.

Und denne sprach die Henne.

E
265 Beiträge seit 2004
vor 17 Jahren

Was ich in gedanken gemeint habe war ein TileSet bassierter Level, google müsste genügend ausspucken.

Ich kann mir unter einem 2d scrollup shooter nichts vorstellen. Wie sieht so ein Hintergrundbild aus? (Wenn es nicht zu groß ist kannst als anhang mitdran hängen.)

Hammala Themenstarter:in
23 Beiträge seit 2006
vor 17 Jahren

Ich versuche es zu erklären:

In meinem Spiel fliegt man mit einer F14 über eine Landschaft.
Die Landschaft scrollt von oben nach unten durch den Bildschirm was einem das Gefühl gibt man bewegt sich.

Ich hab nun ein Bild mit angehängt.

Die 2 schwarzen Rechtecke oben rechts sind "Gegner welche von oben nach unten durchfliegen". Ich mit meiner F16 kann mich in alle Richtungen Bewegen innerhalb des anzeigeraums.

Hoffe ich konnte es nun etwas besser erklären.

Nach "TileSet bassierter Level" werde ich mich erkundigen, danke.

Und denne sprach die Henne.

E
265 Beiträge seit 2004
vor 17 Jahren

mhm, tiles lassen sich hier nicht wirklich abbilden.
Bin selbst überfragt wie man das am besten löst.

Nur eine Bitmap verwenden?

Hammala Themenstarter:in
23 Beiträge seit 2006
vor 17 Jahren

Nun ich denke, da ich nun keine Probleme mehr habe mit der Geschwindigkeiten und dem Speicher, geht es wohl in Ordnung wenn ich pro Level mehrere große Bilder verwende.

Ich glaub ich überdenke die Hintergründe erst wenn wieder Probleme auftreten sollten.
Aber das mit dem MipMaps das hat für mich den Tag heute gerettet 😉

Danke nochmal für die Erklärung @EvilTk. Ich habe in meinem Buch darüber nichts gefunden 😦.

Und denne sprach die Henne.

E
265 Beiträge seit 2004
vor 17 Jahren

Der Link sollte erklären was ich meinte.
http://www.gamedev.net/reference/articles/article1134.asp