Verwalten von Ressourcen (Direct3D 9)

Die Ressourcenverwaltung ist der Prozess, bei dem Ressourcen von Systemspeicher zu Speicher mit Zugriff auf Geräte heraufgestuft und aus dem Speicher verworfen werden, auf den auf gerätezugriffsfähige Speicher zugegriffen werden kann. Die Direct3D-Laufzeit verfügt über einen eigenen Verwaltungsalgorithmus, der auf einer am wenigsten verwendeten Prioritätstechnik basiert. Direct3D wechselt zu einer zuletzt verwendeten Prioritätstechnik, wenn erkannt wird, dass in einem einzelnen Frame mehr Ressourcen verwendet werden, als im speicherzugriffsfähigen Gerät vorhanden sein können– zwischen IDirect3DDevice9::BeginScene und IDirect3DDevice9:EndScene-Aufrufen .

Verwenden Sie das Flag D3DPOOL_DEFAULT zum Zeitpunkt der Erstellung, um anzugeben, dass eine Ressource im Speicherpool platziert wird, der am besten für den Satz von Verwendungen geeignet ist, die für die angegebene Ressource angefordert werden. Dies ist in der Regel Videospeicher, einschließlich des lokalen Videospeichers und des beschleunigten Grafikports (AGP). Ressourcen im Standardpool werden nicht durch Übergänge zwischen dem verlorenen und dem Betriebszustand des Geräts beibehalten. Diese Ressourcen müssen vor dem Aufrufen des Zurücksetzens freigegeben und dann neu erstellt werden.

Verwenden Sie das flag D3DPOOL_MANAGED zur Erstellungszeit, um eine verwaltete Ressource anzugeben. Verwaltete Ressourcen bleiben durch Übergänge zwischen dem verlorenen und dem Betriebszustand des Geräts erhalten. Diese Ressourcen sind sowohl im Video- als auch im Systemspeicher vorhanden. Eine verwaltete Ressource wird beim Rendern in den Videospeicher kopiert. Das Gerät kann mit einem Aufruf von IDirect3DDevice9::Reset wiederhergestellt werden, und solche Ressourcen funktionieren weiterhin normal, ohne mit Daten neu geladen zu werden. Wenn das Gerät jedoch zerstört und neu erstellt werden muss, müssen alle Ressourcen neu erstellt werden.

Die Ressourcenverwaltung wird nicht für Ressourcen empfohlen, die sich mit hoher Häufigkeit ändern. Beispielsweise ändern Scheitelpunkt- und Indexpuffer, die zum Durchlaufen eines Szenendiagramms für jeden Frame verwendet werden, der für den Benutzer nur Die Geometrie rendert, die für den Benutzer sichtbar ist, jeden Frame. Da verwaltete Ressourcen vom Systemspeicher unterstützt werden, müssen die konstanten Änderungen im Systemspeicher aktualisiert werden, was zu einer schwerwiegenden Leistungsbeeinträchtigung führen kann. Für dieses spezielle Szenario sollten D3DPOOL_DEFAULT zusammen mit D3DUSAGE_DYNAMIC verwendet werden.

Ein weiteres Beispiel, für das die Ressourcenverwaltung nicht empfohlen wird (und von der Runtime explizit nicht zugelassen wird), ist die Verwaltung einer Textur, die mit D3DUSAGE_RENDERTARGET erstellt wurde. Wenn der von Renderzielen verwendete Arbeitsspeicher von der Runtime verwaltet wird, müsste der Inhalt während des Renderings ständig in den Systemspeicher kopiert werden, was zu hohen Leistungseinbußen führt. Aus diesem Grund müssen Renderziele im Standardpool erstellt werden. Wenn der CPU-Zugriff auf die in einem Renderziel enthaltenen Daten erforderlich ist, müssen die Daten in eine Ressource kopiert werden, die in D3DPOOL_SYSTEMMEM mit IDirect3DDevice9::UpdateTexture oder IDirect3DDevice9::UpdateSurface erstellt wurde.

Weitere Informationen zum verlorenen Zustand eines Geräts finden Sie unter Verlorene Geräte (Direct3D 9).

Direct3D-Ressourcen