(erledigt) [D3D 11] Zerstört ein Device seine Childs?

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

(erledigt) [D3D 11] Zerstört ein Device seine Childs?

Beitrag von Krishty »

Hat zufällig jemand Quellen parat, ob das finale ID3D11Device::Release() alle Daten des Devices freigibt (also alle ID3D11DeviceChilds)? Ich habe das mal gelesen, aber nun finde ich es nicht mehr in der MSDN.

Das ist mir wichtig, weil es …
  1. … eine Verletzung der COM-Regeln darstellt (Objekte mit offenen Referenzen dürfen nicht zerstört werden) – allerdings in diesem Fall eine absichtliche
  2. … mir viel Aufräum-Code ersparen könnte.
Zuletzt geändert von Krishty am 01.01.2018, 22:29, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
gdsWizard
Establishment
Beiträge: 237
Registriert: 04.02.2005, 09:12
Benutzertext: www.gamedevstudio.com
Echter Name: Thomas Mittelsdorf
Wohnort: Meiningen
Kontaktdaten:

Re: [D3D 11] Zerstört ein Device seine Childs?

Beitrag von gdsWizard »

Probiere es doch einfach mal aus. Musst halt einfach vorher schon alle Ressourcen allozieren dann einfach Release fürs Device und dann irgendwas mit den Ressourcen machen.
NytroX
Establishment
Beiträge: 358
Registriert: 03.10.2003, 12:47

Re: [D3D 11] Zerstört ein Device seine Childs?

Beitrag von NytroX »

Also ich mache zwar seit einiger Zeit nichts mehr mit DX, aber das wäre mir neu, dass das automatisch passiert :-)
Sind ja COM Devices, d.h. die haben ja einfach einen "intrusive" Reference Count (über AddRef() und Release()); d.h. die Ressourcen gurken dann im Speicher rum, wenn du sie nicht freigibst.

Ich glaube du kannst dir die Arbeit sowieso nicht sparen, weil du ja auch auf eine "DeviceLostException" bzw. "DeviceNotResetException" reagieren musst; da musst du die Resourcen manuell freigeben und Reset() aufrufen (es sein denn du schmeißt immer das ganze Device weg, aber selbst dann...).
Du kannst das auch prüfen, wenn du dir das Debug interface holst (würde ich sowieso empfehlen). Der zeigt dir dann beim Beenden die nicht freigegebenen Objekte / Refcounts an: Interner Refcount von DX (die sind ok), und Externer Refcount, d.h. die vom User (die sind nicht ok).
(Siehe auch : http://seanmiddleditch.com/direct3d-11- ... pi-tricks/)
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D 11] Zerstört ein Device seine Childs?

Beitrag von Krishty »

Ja; ich bin relativ schockiert, wie sehr ich mich in der Sache geirrt habe. Die COM-Regeln werden eingehalten (d.h., die Ressourcen bleiben nach Device-Zerstörung erhalten) und ich habe die dicken Leaks, die man auch erwartet hätte. (Allerdings bewirkt das Binden ans Device anders als in COM üblich kein AddRef(); wegen zu hohen Overheads haben sie das nach D3D 9 abgeschafft.)

Den Artikel, der explizit das Gegenteil erklärt hatte, finde ich auch nicht mehr. Den Gedanken sollten wir begraben, bevor eine urbane Legende draus wird :)

Ich danke euch beiden!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten