Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 01.06.2004, 09:24 Titel: Draw (Sprite) Speicherfrage |
|
|
Warum wird durch folgende Funktion so viel Speicher verbraucht ? Werden immer die gleichen Objecte angezeigt bleibt der Speicherverbrauch konstant bewege ich mich aber und es werden andere Objekte angezeigt und die alten nicht mehr oder immer noch wird immer mehr Speicher verbraucht auch wenn die neuen Objekte die gleichen Texturen verwenden wie die alten.
Es wird auch nicht mal der Speicher wieder freigegeben erst nach dem beenden des Programmes.
Code: | void CSprite::Draw(double stepx, double stepy)
{
//Kein brauchbares Animationsset gewählt
if(m_CurrentAnimSet==-1 || !m_Visible)
return;
m_vCenter = D3DXVECTOR3((float)m_AnimSet[m_CurrentAnimSet].m_Width/2, (float)m_AnimSet[m_CurrentAnimSet].m_Height/2,0.0f);
// Transformationsmatrizen angeben - neu im Summer Update 2003
D3DXMATRIXA16 matCombo, matRot, matScale, matTrans;
D3DXMatrixRotationZ(&matRot,m_Rotation);
D3DXMatrixScaling(&matScale, m_vScale.x, m_vScale.y, m_vScale.z);
D3DXMatrixTranslation(&matTrans, m_vPosition.x+stepx, m_vPosition.y+stepy, m_vPosition.z);
D3DXMatrixMultiply(&matCombo, &matRot, &matTrans);
D3DXMatrixMultiply(&matCombo, &matScale, &matCombo);
m_lpSprite->Begin(D3DXSPRITE_DONOTSAVESTATE | D3DXSPRITE_ALPHABLEND);
m_lpSprite->SetTransform(&matCombo);
// Sprite in der passenden Animationsstufe zeichnen
m_lpSprite->Draw(m_AnimSet[m_CurrentAnimSet].m_AnimationVec[m_CurrentImage],
NULL,
&m_vCenter,
NULL,
D3DCOLOR_RGBA(255,255,255,(int)m_Alpha));
m_lpSprite->End();
} |
Code: | int m_CurrentImage;
typedef struct tAnimList
{
char name[64];
vector<LPDIRECT3DTEXTURE9> m_AnimationVec;
int m_Width;
int m_Height;
};
vector<tAnimList> m_AnimSet;
int m_CurrentAnimSet; |
Der Speicher wird übrigens nur verbraucht wenn die Draw Methode aufgerufen wird habe ich herausgefunden. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.06.2004, 10:31 Titel: |
|
|
Kannst du das mit einem kleinen Testprogramm auch nachvollziehen?
C. |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.06.2004, 14:18 Titel: |
|
|
Ich bin mir nicht ganz sicher, aber wenn ich nur rumlaufe ohne zu schiessen, ist der Speicherverbrauch nicht so hoch, erste wenn ich ein paar mal schiesse wird es schlimm. Bist du sicher, dass es an der Draw()-Fkt liegt?
C. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 01.06.2004, 14:31 Titel: |
|
|
Ja, das schiessen beschleunigt den Vorgang nur. Weil dort auch neue Spriteklassen erstellt werden etc. und diese rufen ja wiederum die Draw Funktion auf. Kann es daran liegen das ich bei jeder meiner Klasse ein Sprite Interface benutze anstatt nur eine einzige (ist mir grade aufgefallen). _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.06.2004, 14:40 Titel: |
|
|
Probiere doch einfach mal den Pointer auf das Interface static zu machen. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 01.06.2004, 15:18 Titel: |
|
|
Es hat leider nichts gebracht. Genau wie vorher. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.06.2004, 15:30 Titel: |
|
|
Hallo,
ich weiss nicht warum das passieren sollte. Du lädst die Texturen doch bestimmt zu Beginn einmalig, oder, nicht pro Objekt zu Laufzeit oder sowas verrücktes?
C. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 01.06.2004, 15:44 Titel: |
|
|
Hehe schön wäre es dann hätt ich ja das Problem, aber nein sowas mach ich nicht. Ich hab den Code ja oben gepostet. Wenn ich die Draw Methode des Sprites auskommentiere wird kein zusätzlicher Speicher verhauen.
Und mit dem Flush Befehl hab ichs auch schon probiert, es gab da aber keinen Unterschied, wenn du willst kann ich dir ja mal den gesammten Code senden, allerdings glaub ich fast nicht mehr an rettung  _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.06.2004, 15:45 Titel: |
|
|
Schicke mal. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 01.06.2004, 16:27 Titel: |
|
|
PN  _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.06.2004, 17:05 Titel: |
|
|
Habe ich bekommen, musste einiges Anpassen, ich sehe aber leider weder den Boden, noch Gegner, noch sonst was. Ich sehe jetzt so schnell nicht warum. Ich sehe aber, dass du bei jedem Schuss der abgefeuert wird ein neues Sprite-Objekt erzeugst (Breakpoint in Sprite->Create). Ich sehe nicht, dass das irgendwo freigegeben wird.
Ich habe den Zeiger auf das Sprite Objekt mal static gemacht, d.h. natürlich auch, dass du nur noch einmal D3DXSpriteCreate() aufrufen muss. Das bringt schonmal 5 MB beim starten des Spiels weniger. Danach wurde bei mir immer, wenn ich das Maschinengewehr komplett abgefeuert habe nur noch ca. 10 KB verbraucht, im Gegensatz zu 150 kb voher.
Du kannst das trotzdem nicht so lassen. Wenigsten für die Patronen brauchst du sowas wie einen Ringpuffer mit Sprites, die immer wieder verwendet werden und nicht neu angelegt werden müssen.
D3D-Objekte sollte man sowieso nie während des Programmablaufs kreiern/zerstören.
Christian |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 01.06.2004, 17:11 Titel: |
|
|
Gehe ich Recht in der Annahme, das es um D3DXSprite Objekte geht?
Also, ich persönlich würde ja nie für ein jedes neue Objekt ein neues Sprite-Objekt anlegen. In meiner D3D Class wird automatisch gleich nach dem Device ein XSpriteObjekt erstellt. Darafu hab ich dann ähnlich zugriff, wie auf das Device:
DIrect3D::GetXSprite()
Dann speicher ich von jedem Sprite Objekt noch ein Zeiger, auf das eigentlich XSprite und zeig es damit an. Denn man braucht ja überhaupt keine Eigenschaften zuz ändern, man braucht ja nur die Anzeige-Methode, daraum reicht ein einziges SpriteObjekt auf vollkommen aus.
Ich versteht gar nicht wie man auf die Idee kommen kann für jedes kleine Sprite, das man anzeigen will, ein eigenen XSpriteObjekt zu erstellen.
[edit]Ich hab dazu auch schon mal was hier irgendwo gepostet. Ging um das entsprechenden Kaüpitel im Buch und um das Beispielprogramm.[/edit] _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 01.06.2004, 17:22 Titel: |
|
|
@C: Ohh ähhm ja ich hab vergessen nen Test rauszumachen um was anzuzeigen musst du nur mal kurz die leertaste drücken.
Naja war mein erster Versuch im 2D Bereich, mhh Okay dann werde ich mal die veränderungen einbaun ich hab da wirklich viele miese anfängerfehler gemacht :/ naja learning by doing. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.06.2004, 17:37 Titel: |
|
|
@Jonathan_Klein
Man kann Performance mäßig einiges machen. Im Buch denke ich aber nicht, dass es unbedingt sinnvoll ist, da es ev. nicht jeder versteht.
@FallenAngel84:
Ich weiss nicht, ob du die Zahl an Sprites erreichst, ab der es was ausmacht, aber (Achtung FAQ Alarm!) man könnte sich beispielweise selber einen dynamischen VB erzeugen und die Quads nach Textur sortiert hineinschreiben. Natürlich müßte man dann die Vertexkoordinaten selbst transformieren - auf einen Test würde ich es aber ankommen lassen.
C. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 01.06.2004, 17:40 Titel: |
|
|
Wie hast du das static gemacht ? Als ich das probiert habe habe ich schon beim kompilieren tierische Probleme bekommen. Den Ringpuffer gibt es schon nur hab ich den etwas zu klein gewählt. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
|