GUI Design gut?



  • Dazu sagte ich dir aber bereits: Nutz Pix^^



  • Oh, an den Post letzt Seite habe ich gar nicht mehr gedacht.
    Nur wie genau soll ich das verwenden um ein Memory Leak zu finden? Ich hab das gnaze jetzt mal für den Resourcengebrauch durchlaufen lassen, doch mit den Ergebnissen weiß ich nichts anzufangen 😞



  • Kopier mal bitte die Trace-Meldung die du bekommst hier rein.

    Wieso denn das?

    Es ist so, weil es so definiert wurde.
    Und definiert wurde es vermutlich deswegen so, weil es (vermutlich) für die Grafikkarte am praktischten ist.

    Aber auch wenn ich überall 0.5 Pixel abziehe habe ich das gleiche Ergebnis. Aber nur, wenn ich über etwas anderes drübermale.

    Glaub ich nicht.
    Hast du die Koordinaten beim Rendern des Dreiecks auf die Textur UND beim Rendern der Textur auf den Backbuffer angepasst?



  • hustbaer schrieb:

    Es ist so, weil es so definiert wurde.
    Und definiert wurde es vermutlich deswegen so, weil es (vermutlich) für die Grafikkarte am praktischten ist.

    Ok, fängt der zweite Pixel denn dann bei 0.5 oder 1 an? Und gilt das nur für Texturen?

    hustbaer schrieb:

    Glaub ich nicht.
    Hast du die Koordinaten beim Rendern des Dreiecks auf die Textur UND beim Rendern der Textur auf den Backbuffer angepasst?

    Die Koordinaten für die Textur habe ich jetzt auch angepasst und jetzt klappts wirklich 🙂

    hustbaer schrieb:

    Kopier mal bitte die Trace-Meldung die du bekommst hier rein.

    Sorry für die Frage, aber welche genau meinst du?



  • GUIFreak schrieb:

    Ok, fängt der zweite Pixel denn dann bei 0.5 oder 1 an? Und gilt das nur für Texturen?

    Einfach hier lesen: http://msdn.microsoft.com/en-us/library/bb219690.aspx



  • GUIFreak schrieb:

    hustbaer schrieb:

    Es ist so, weil es so definiert wurde.
    Und definiert wurde es vermutlich deswegen so, weil es (vermutlich) für die Grafikkarte am praktischten ist.

    Ok, fängt der zweite Pixel denn dann bei 0.5 oder 1 an? Und gilt das nur für Texturen?

    Die Pixel sind 1.0 x 1.0 gross und "überlappen" nicht (und haben auch keine Freiräume dazwischen). Wenn der erste bei -0.5 anfängt, fängt der 2. also bei +0.5 an.
    Und es gilt für alle Render-Targets, egal ob Textur oder Backbuffer.

    hustbaer schrieb:

    Kopier mal bitte die Trace-Meldung die du bekommst hier rein.

    Sorry für die Frage, aber welche genau meinst du?

    Du hast geschrieben

    Mein Projekt ist noch recht klein, und deswegen was es simpel, alle nötigen Release() funktionen zu ergänzen, aber dennoch wird mir gesagt, dass ich 80kB nicht frei lasse.

    Ich nehme mal an das "dir sagen" wird in Form einer (textuellen) Nachricht erfolgen.
    Diese Nachricht (genauer Wortlaut) wäre interessant.
    Falls die Meldung im Debug-Output auftaucht bitte auch die letzten paar Zeilen vor und nach der Meldung.



  • Ich schätze mal, dass das Fenster, bzw das DirectX Device freigegeben wird, bevor alle Resourcen released sind. Nehme mal an, dass das gleiche Problem darstellt wie bei OpenGL.



  • Da die Meldung recht lang ist, habe ich mal bei Patsebin gepostet.
    Die Threads werden dabei vom Kompiler/Linker (?) erzeugt. Wäre auch nochmal eine Frage, wieso?
    http://pastebin.com/jTWxuAy5



  • 1720 Objekte, in Summe ca. 1 MB Speicher... vonwegen 80KB.
    Also ich schätze da fehlt so ziemlich jedes Release() auf Direct3D Resourcen.

    D.h. du hast eben gerade NICHT jedes Release() ergänzt...

    p.S.: zu jeden GetXxx() das einen Interface-Zeiger zurückgibt gehört ein Release(), zu jedem CreateXxx() ebenso, und natürlich müssen ganz zum Schluss das D3D Device und das D3D Objekt freigegeben werden.



  • Mein Projekt ist noch ziemlich klein und übersichtlich.
    Und ich habe wirklich auf jede LPDIRECT3D... Resource ein Release in der umgekehrten Reihenfolge, wie sie erstellt wurden gemacht. Der Device wird auch wirklich erst als letztes freigegeben.
    Was mich aber auch wundert ist, dass das ganze immer zwischen 800 und 1100 kb schwankt, nach jedem ausführen ohne neu zu kompilieren oder so.
    Mein allerletztes Release gibt mir auch 0 zurück, was ja laut MSDN bedeutet, dass kein Direct3D Objekt mehr existiert.



  • GUIFreak schrieb:

    Und ich habe wirklich auf jede LPDIRECT3D... Resource ein Release in der umgekehrten Reihenfolge, wie sie erstellt wurden gemacht.

    Wie gesagt, nicht nur nach CreateXxx() musst du Release() machen, sondern auch nach GetXxx().

    Der Device wird auch wirklich erst als letztes freigegeben.

    Du musst auch das Direct3D Objekt selbst freigeben, nicht nur das Device.
    Das D3D Objekt ist das was du z.B. mit Direct3DCreate9() erzeugst.

    Mein allerletztes Release gibt mir auch 0 zurück, was ja laut MSDN bedeutet, dass kein Direct3D Objekt mehr existiert.

    Die 0 bedeutet dass das eine Objekt auf das du Release() aufgerufen hast jetzt freigegeben wurde, nicht dass alle Objekte weg sind.



  • hustbaer schrieb:

    Wie gesagt, nicht nur nach CreateXxx() musst du Release() machen, sondern auch nach GetXxx().
    Du musst auch das Direct3D Objekt selbst freigeben, nicht nur das Device.
    Das D3D Objekt ist das was du z.B. mit Direct3DCreate9() erzeugst.

    Ich geb wirklich alles frei was auch nur annähernd mit Direct3D in Verbindung kommt.

    Das sind meine Objekte im Moment:

    LPDIRECT3D9 d3d;
    LPDIRECT3DDEVICE9	d3dd;
    LPDIRECT3DVERTEXBUFFER9 vBuffer;
    LPDIRECT3DTEXTURE9 renderTexture;
    LPDIRECT3DSURFACE9 renderSurface, backBuffer;
    

    Mehr brauchts für mein Vorhaben (sieht man ja auf den Bildern) nicht.

    Die 0 bedeutet dass das eine Objekt auf das du Release() aufgerufen hast jetzt freigegeben wurde, nicht dass alle Objekte weg sind.

    `Aus der MSDN:

    The method returns the new reference count. This value is intended to be used only for test purposes.

    `
    OK, hab das falsch verstanden, gibt wirklich nur zurück, dass das Objekt weg ist, aber alle meine Release-Funktionen geben 0 zurück.



  • GUIFreak schrieb:

    Ich geb wirklich alles frei was auch nur annähernd mit Direct3D in Verbindung kommt.

    Wenn du das tätest würde die Debug Runtime nicht schreien dass du vergisst was freizugeben...



  • Also, wenn ich tatsächlich was vergessen hätte, was nimtm bei 2 Dreiecken dann 80-110 kb in Anspruch?
    Und das seltsame ist, wenn ich alle Release() weglasse schwankt der Wert im Debuger immer noch zwischen 80 und 110kb....
    Wenn ich das ganze jetzt als 64-Bit Programm installiere bleibt der Debuger ruhig.
    Wird dann tatsächlich alles freigegeben, oder gibts für 64-Bit keine D3D Debug Runtime?



  • Ich arbeite im Moment auch an einem Projekt mit D3D (9), und da kommen keinerlei Meldungen wenn ich alles freigebe (und wenn ich nicht alles freigebe kommen genau so die "MemFini" Meldungen). Ist auch ein 32 Bit Programm. Viel mehr kann ich dazu nicht sagen.

    Poste mal deinen Code, vielleicht findet sich jemand der da mal drübersieht 🙂



  • Hmm,
    ich wollte den Code mal kürzen, damit der einfacher zu lesen ist, und shcon hat sich das Problem in Luft aufgelöst....
    Ich probier jetzt nochmal nen bisschen rum, ob ich genau die Quelle finde, ansonsten lade ich einfach alles hoch.



  • Fehler gefunden.
    Da kamen sich WinApi und DirectX an irgendeiner abgelegenen Stelle irgendwie in die Quere 🙄
    Hab das ganze jetzt eleganter gelöst.



  • GUIFreak schrieb:

    Da kamen sich WinApi und DirectX an irgendeiner abgelegenen Stelle irgendwie in die Quere 🙄

    Das halte ich jetzt fast für ein Gerücht 🙂



  • hustbaer schrieb:

    Das halte ich jetzt fast für ein Gerücht 🙂

    Nun gut, kann auch an meiner schlechten Programmierung legen, aber hauptsache Problem gelöst 🙂
    Jetzt wollte ich mir DirectInput ein bisschen rumspielen, damit man mit meinem GUI auch was anfangen kann, nur irgendwie bekomme ich da keine Debug Version von. Im DirectX Control Panel ist alles grau unterlegt.
    Bild
    Das ganze ist übrigens auch bei DirectX10/11 bei mir so.
    Bild



  • Debug Runtimes installieren.


Anmelden zum Antworten