D3DXSprite -> Resourcenverschwendung??
-
Hallo, ich bin gerade dabei ein Breakout Spiel zu machen.
Dabei habe ich die Blöcke oben(die man mit dem Ball abschießen muss) mit D3DXSprite Objekte gemacht.
(Es ist in 2D)Kann es nun sein das die Sprites einen Haufen Speicher benötigen, obwohl die nur 100*25 Pixel groß sind?
Ich habe mal 400 Blöcke erzeugt und mein Programm brauchte beim Task-Manager 200 MB Speicher! Wenn ich 200 Blöcke mache brauche ich "nur" 100 MB Speicher.
Ist es üblich in einem Programm eine deratige Anzahl von Sprites zu erschaffen, oder erledigt man sowas anders? Über Texturen oder Surface-Locken und Pixel setzten.
Hier ein Ausschnitt.
BOOL CBlock::Init(LPDIRECT3DDEVICE9 pDevice,CResourceManager *pResourceManager) { m_pResourceManager = pResourceManager; m_lpDevice = pDevice; D3DXCreateSprite(m_lpDevice, &m_lpSprite); return 0; } D3DXVECTOR2 CBlock::GetPosition(void) { return m_vPosition; } void CBlock::Draw(void) { D3DXMatrixTransformation2D(&m_Matrix,NULL,0.0,&m_vScale,&m_vRotationCenter, 0,&this->GetPosition()); m_lpSprite->Begin(D3DXSPRITE_DONOTSAVESTATE | D3DXSPRITE_ALPHABLEND); m_lpSprite->SetTransform(&m_Matrix); m_lpSprite->Draw(m_pResourceManager->GetTexture("Block.png"),NULL,NULL,NULL,m_color); m_lpSprite->End(); }
-
Ähm was genau heißt "400 Blöcke erzeugen" ? Hast du 400 verschiedene Texturen geladen? Deine 100x25 Pixel großen Texturen werden übrigens auf 128x128 aligned.
-
Nein, die Textur wird nur 1 mal geladen, im m_pResourceManager.
Die Klasse ResourceManager verwaltet die bei mir.Ich habe 400 Instancen von der Klasse CBlock erzeugt.
-
Du erzeugst das Teil in Deinem Init():
D3DXCreateSprite(m_lpDevice, &m_lpSprite);
Jedes Mal.
Stattdessen solltest Du das nur einmal Createn. (if(!m_pSprite) D3DXCreate())
Die Draw-Funktion kann so bleiben wie sie ist.
-
Wenn ich aber dann einem Block eine andere Textur geben will, als ein anderer hat, geht das dann nicht oder? Weil dann ja nur ein Sprite existiert.
-
Ist jetzt schon was länger her, aber
m_lpSprite->Draw(m_pResourceManager->GetTexture("Block.png"),NULL,NULL,NULL,m_color);
sieht mir doch so aus, als ob Du in GetTexture() auch jede andere Textur eintragen könntest. Dann muss wohl nur die Dimension (Höhe x Breite) übereinstimmen, sonst wird's sicher verzerrt.
-
Optimizer schrieb:
Mein Spiel (.Net 2.0 Release jetzt verfügbar)
Äh, warst Du nicht der Typ, der _GEGEN_ Installer für jedes kleine Progrämmchen war?!

-
Ah jetzt habe ich kapiert.
Ich habe das Sprite Objekt jetzt statisch in die Klasse gemacht.
Und es funktioniert danke.Habe gedacht ich muß für jedes Sprite extra
D3DXCreateSprite(m_lpDevice, &m_lpSprite);
aufrufen.
-
Sgt. Nukem schrieb:
Optimizer schrieb:
Mein Spiel (.Net 2.0 Release jetzt verfügbar)
Äh, warst Du nicht der Typ, der _GEGEN_ Installer für jedes kleine Progrämmchen war?!

Das ist korrekt. Aber erstens ist mein Spiel nicht klein, sondern hochprofessionell
und zweites ist das sonst sehr fricklig mit Managed DirectX zum installieren (und 20 + 2 MB Download statt insgesamt 6 MB). Ich denke, dass es so für alle am angenehmsten ist... und wenn ihr das Programm deinstalliert, löscht es sogar sein Verzeichnis weg, wenn ihr nicht selber Dateien darin ablegt.

-
