DX9 - Texturspeicher freigegeben? / Memory still allocated!
-
xindon schrieb:
-> in umgekehrter Reihenfolge natürlich
quark. dann wenn du es nicht mehr brauchst. die reihenfolge ist absolut wurst.
-
otze schrieb:
xindon schrieb:
-> in umgekehrter Reihenfolge natürlich
quark. dann wenn du es nicht mehr brauchst. die reihenfolge ist absolut wurst.
Fuer manche Sachen ist es chon sinnvoll, die Reihenfolge einzuhalten. Wenn ich z.b. erst ein Device erzeuge, dann mit dem Device eine Texture und mir dann einen der Mip-Level aus der Textur hole.
Im Grunde kann man aber auch einfach den Prozess beenden, dann wird auch alles freigegeben. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
Ja, so habt ihr es bei Anno gemacht, oder?

-
Nochmals zuallererst vielen Dank für die zahlreichen Antworten!
Ich habe es jetzt so gemacht und es funktioniert (ich poste es mal, eventuell für andere Anfänger):
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } } #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }void cleanD3D(void) { DWORD i; for(i=0;i<numMaterials;i++) { SAFE_RELEASE(texture[i]); SAFE_RELEASE(t_buffer); SAFE_RELEASE(z_buffer); } SAFE_RELEASE(meshSpaceship); SAFE_RELEASE(d3ddev); SAFE_RELEASE(d3d); SAFE_DELETE_ARRAY(texture); SAFE_DELETE_ARRAY(material); SAFE_DELETE(t_buffer); SAFE_DELETE(z_buffer); SAFE_DELETE(meshSpaceship); SAFE_DELETE(d3ddev); SAFE_DELETE(d3d); return; }Eine Frage habe ich aber noch zum Material. Es ist ganz egal, ob ich den Pointer freigebe oder nicht, es tauchen keine Memory Leaks mehr auf. Aber ich habe doch dynamisch Speicher auf dem Heap reserviert:
material = new D3DMATERIAL9[numMaterials];Müsste da nicht auch eine Fehlermeldung kommen?
-
Optimizer schrieb:
Ja, so habt ihr es bei Anno gemacht, oder?

Noe, aber in meinen 4k Intros. Da muss man ja auch nicht zwischendurch die Auefloesung wechseln. Moment mal, manche Spiele muessen auch dafuer neu starten... f'`8k
Gruß, TGGC (making great games since 1992)
-
Die ganzen D3D Ressourcen wie Device, Texturen etc. muss man doch "releasen" und nicht "deleten", oder? (wegen SAFE_DELETE(d3d); in iops sourcecode)
-
this->that schrieb:
Die ganzen D3D Ressourcen wie Device, Texturen etc. muss man doch "releasen" und nicht "deleten", oder? (wegen SAFE_DELETE(d3d); in iops sourcecode)
Hm, stimmt, SAFE_DELETE(d3d) ist hier überflüssig, es ist mit d3d ja kein Speicher auf dem Heap allokiert worden, richtig?! Da war ich wohl übermütig

-
iop schrieb:
Hm, stimmt, SAFE_DELETE(d3d) ist hier überflüssig, es ist mit d3d ja kein Speicher auf dem Heap allokiert worden, richtig?!
Genau.
Eine Frage, weil ich mir nimmer sicher bin: Wenn ich ne D3D Ressource anlege, zB nen VB mit CreateVertexBuffer, dann hab ich in ppVertexBuffer nen Pointer auf ein COM Objekt, dessen Referenzzähler bereits auf 1 steht. D.h. wenn ich mit dem VB fertig bin, muss ich einmal Release aufrufen? (RefCount=0, Objekt kann gelöscht werden).
Wann wird eigentlich der interne Reference Counter erhöht? Da ich ja immer genau so oft Release() aufrufen muss wie der interne Reference Counter, muss ich mir ja irgendwo merken auf welchem Wert der RefCounter gerade steht, oder?
-
*push.
Weiß das denn wirklich niemand?

-
Ich verstehe die Frage nicht ganz. Zu einem create gehoert ein Release, ganz einfach. Egal wie der Ref Counter ist. Erhoert wird der Counter, wenn die Resource durch irgendwas referenziert wird. Darum ist ja auch die Reihenfolge nicht so wichtig beim Releasen, der Ref Counter sorgt zur Not dafuer, dass ein zu frueh releastes Objekt nicht direkt zerstoert wird. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
Ich wiederhole meine Frage einfach nochmal:
Wann wird der Reference Counter erhöht? Klar durch AddRef(), aber das wird man selber ja wohl nie benutzen. Hat da jemand mal ein konkretes Beispiel zB für ne Textur oder nen VB?
-
this->that schrieb:
Ich wiederhole meine Frage einfach nochmal:
Wann wird der Reference Counter erhöht? Klar durch AddRef(), aber das wird man selber ja wohl nie benutzen. Hat da jemand mal ein konkretes Beispiel zB für ne Textur oder nen VB?Ich habs zwar eben schon gesagt, aber hier nochmal die Antwort aus der Doku:
reference count:
Control for a COM object. When an object is created, its reference count is set to 1. Every time an interface is bound to the object, its reference count is incremented; when the interface connection is destroyed, the reference count is decremented. The object is destroyed when the reference count reaches 0. All interfaces to that object are then invalid.f'`8k
Gruß, TGGC (making great games since 1992)
-
Ich kenne die Definition -.-
Ich hätte einfach mal gerne ein KONKRETES Beispiel, bei dem der RefCount erhöht wird auf einen Wert >1 (ohne direkte Benutzung von AddRef())