Probleme mit Sprites und der Performance
-
Abend!
Ich wollte eine simple tilebasierte Map zeichnen und habe einfach ein zweidimensionales Array erstellt.
Früher hatte ich so etwas noch mit DirectDraw gemacht und da lief alles ziemlich fix, jetzt habe ich, wenn ich 32*24 sprites zeichne die 32*32 Pixel groß sind nur 24 Frames pro Sekunde (Release). Hier die Funktion:sprite->Begin(D3DXSPRITE_ALPHABLEND); sprite->Draw(bitmap, 0, 0,&vPosition,0xFFFFFFFF); &vRotationCenter, rotation, &vPosition, 0xFFFFFFFF); sprite->End();
Erste Vermutung: Begin und End wird eindeutig zu häufig aufgerufen, also nachgeschaut:
**
The application typically first calls ID3DXSprite::Begin, which allows control over the device render state, alpha blending, and sprite transformation and sorting.Then for each sprite to be displayed, call ID3DXSprite::Draw. ID3DXSprite::Draw can be called repeatedly to store any number of sprites.
To display the batched sprites to the device, call ID3DXSprite::End or ID3DXSprite::Flush.
**Imho heißt das, ähnlich wie beim BeginScene und EndScene soll erst Begin() aufrufen, per Draw beliebig viele Sprites angehangen und per End() das ganze beendet werden. Also habe ich testweise folgendes probiert:
LPD3DXSPRITE sprite; D3DXCreateSprite(device, &sprite); // [...] sprite->Begin(D3DXSPRITE_ALPHABLEND); for(int i=0; i<32; ++i) for(int j=0; j<24; ++j) tilemap[i][j].tile->Draw(); sprite->End();
Leider ist dann nichts sichtbar
aber immerhin sind die FPS wieder bei 85
Kann mir da jemand helfen?
-
Lösung gefunden, er hat vollkommen Recht in allem was er schreibt:
**
The documentation is vague, it mentions that ID3DXSprite is 'a sprite object'. In reality it is the sprite interface. You should create only one instance of ID3DXSprite, preferably together with the D3D device.
You certainly don't need it as a member of your sprites and create 500 of them.**