Share via


Automatische Texturverwaltung (Direct3D 9)

Bei der Texturverwaltung wird ermittelt, welche Texturen zu einem bestimmten Zeitpunkt für das Rendern benötigt werden, und um sicherzustellen, dass diese Texturen in den Videospeicher geladen werden. Wie bei jedem Algorithmus variieren Texturverwaltungsschemas in der Komplexität, aber jeder Ansatz für die Texturverwaltung umfasst die folgenden wichtigen Aufgaben.

  • Nachverfolgen der Menge des verfügbaren Texturspeichers.
  • Berechnen, welche Texturen zum Rendern benötigt werden und welche nicht.
  • Bestimmen, welche vorhandenen Texturressourcen mit einem anderen Texturbild neu geladen werden können und welche Oberflächen zerstört und durch neue Texturressourcen ersetzt werden sollen.

Direct3D implementiert eine systemgestützte Texturverwaltung, um sicherzustellen, dass Texturen für eine optimale Leistung geladen werden. Texturressourcen, die Direct3D verwaltet, werden als verwaltete Texturen bezeichnet.

Der Textur-Manager verfolgt Texturen mit einem Zeitstempel nach, der angibt, wann die Textur zuletzt verwendet wurde. Anschließend wird ein Algorithmus der letzten Zeit verwendet, um zu bestimmen, welche Texturen entfernt werden sollen. Texturprioritäten werden als Trennzeichen verwendet, wenn zwei Texturen zum Entfernen aus dem Speicher bestimmt sind. Wenn zwei Texturen denselben Prioritätswert haben, wird die zuletzt verwendete Textur entfernt. Wenn jedoch zwei Texturen denselben Zeitstempel aufweisen, wird zuerst die Textur entfernt, die eine niedrigere Priorität hat.

Sie fordern die automatische Texturverwaltung für Texturoberflächen an, wenn Sie sie erstellen. Um eine verwaltete Textur in einer C++-Anwendung abzurufen, erstellen Sie eine Texturressource, indem Sie IDirect3DDevice9::CreateTexture aufrufen und die D3DPOOL_MANAGED für den Pool-Parameter angeben. Sie dürfen nicht angeben, wo die Textur erstellt werden soll. Sie können beim Erstellen einer verwalteten Textur keine D3DPOOL_DEFAULT- oder D3DPOOL_SYSTEMMEM-Flags verwenden. Nachdem Sie die verwaltete Textur erstellt haben, können Sie die IDirect3DDevice9::SetTexture-Methode aufrufen, um sie auf eine Stufe in der Texturkaskade des Renderinggeräts festzulegen.

Sie können verwalteten Texturen eine Priorität zuweisen, indem Sie die IDirect3DResource9::SetPriority-Methode für die Texturoberfläche aufrufen.

Direct3D lädt Texturen bei Bedarf automatisch in den Videospeicher herunter. Das System kann verwaltete Texturen im lokalen oder nicht lokalen Videospeicher zwischenspeichern, abhängig von der Verfügbarkeit des nicht lokalen Videospeichers oder anderen Faktoren. Der Cachespeicherort Ihrer verwalteten Texturen wird ihrer Anwendung weder mitgeteilt, noch sind diese Informationen erforderlich, um die automatische Texturverwaltung zu verwenden. Wenn Ihre Anwendung mehr Texturen verwendet, als in den Videospeicher passen, entfernt Direct3D ältere Texturen aus dem Videospeicher, um Platz für die neuen Texturen zu schaffen. Wenn Sie erneut eine entfernte Textur verwenden, verwendet das System die ursprüngliche Oberfläche der Systemspeichertextur, um die Textur im Videospeichercache neu zu laden. Das Erneute Laden der Textur ist zwar erforderlich, verringert aber auch die Leistung der Anwendung.

Sie können die ursprüngliche Kopie des Systemspeichers der Textur dynamisch ändern, indem Sie die Texturressource aktualisieren oder sperren. Wenn das System eine modifiziert Oberfläche erkennt – nach Abschluss eines Updates oder beim Entsperren der Oberfläche – aktualisiert der Textur-Manager automatisch die Videospeicherkopie der Textur. Der Leistungstreffer ähnelt dem Erneutladen einer entfernten Textur.

Beim Betreten einer neuen Ebene in einem Spiel muss Ihre Anwendung möglicherweise alle verwalteten Texturen aus dem Videospeicher leeren (durch Aufrufen von IDirect3DDevice9::EvictManagedResources).

Weitere Informationen zur Ressourcenverwaltung finden Sie unter Verwalten von Ressourcen (Direct3D 9).

Direct3D-Texturen