JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Draw (Sprite) Speicherfrage
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 01.06.2004, 09:24    Titel: Draw (Sprite) Speicherfrage Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 01.06.2004, 10:31    Titel: Antworten mit Zitat

Kannst du das mit einem kleinen Testprogramm auch nachvollziehen?

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 01.06.2004, 14:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 01.06.2004, 14:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 01.06.2004, 14:40    Titel: Antworten mit Zitat

Probiere doch einfach mal den Pointer auf das Interface static zu machen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 01.06.2004, 15:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 01.06.2004, 15:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 01.06.2004, 15:44    Titel: Antworten mit Zitat

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 Wink
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 01.06.2004, 15:45    Titel: Antworten mit Zitat

Schicke mal.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 01.06.2004, 16:27    Titel: Antworten mit Zitat

PN Very Happy
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 01.06.2004, 17:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 01.06.2004, 17:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 01.06.2004, 17:22    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 01.06.2004, 17:37    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 01.06.2004, 17:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum