Automatische Texturverwaltung (Direct3D 9)
Texturverwaltung ist der Prozess, bei dem bestimmt wird, welche Texturen zum Rendern zu einem bestimmten Zeitpunkt benötigt werden, und um sicherzustellen, dass diese Texturen in den Videospeicher geladen werden. Wie bei jedem Algorithmus variieren auch texturverwaltungsschemas hinsichtlich 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 für das Rendering erforderlich sind 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 die systemgestützte Texturverwaltung, um sicherzustellen, dass Texturen geladen werden, um eine optimale Leistung zu erzielen. Texturressourcen, die von Direct3D verwaltet werden, 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 verwendet, der am wenigsten kürzlich verwendet wird, um zu bestimmen, welche Texturen entfernt werden sollen. Texturprioritäten werden als Tiebreaker verwendet, wenn zwei Texturen aus dem Arbeitsspeicher entfernt werden sollen. Wenn zwei Texturen den gleichen Prioritätswert aufweisen, wird die zuletzt verwendete Textur entfernt. Wenn jedoch zwei Texturen den gleichen Zeitstempel aufweisen, wird die Textur mit einer niedrigeren Priorität zuerst entfernt.
Sie fordern eine 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 D3DPOOL _ MANAGED für den Pool-Parameter angeben. Sie können nicht angeben, wo die Textur erstellt werden soll. Sie können die D3DPOOL _ DEFAULT- oder D3DPOOL _ SYSTEMMEM-Flags nicht verwenden, wenn Sie eine verwaltete Textur erstellen. Nachdem Sie die verwaltete Textur erstellt haben, können Sie die IDirect3DDevice9::SetTexture-Methode aufrufen, um sie auf eine Stufe in der Texturkakade 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 weder an Ihre Anwendung kommuniziert, noch sind diese Informationen erforderlich, um die automatische Texturverwaltung zu verwenden. Wenn Ihre Anwendung mehr Texturen verwendet, als in den Videospeicher passen können, 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 Systemspeichertexturoberfläche, um die Textur im Videospeichercache neu zu laden. Obwohl das erneute Laden der Textur erforderlich ist, verringert dies auch die Leistung der Anwendung.
Sie können die ursprüngliche Systemspeicherkopie der Textur dynamisch ändern, indem Sie die Texturressource aktualisieren oder sperren. Wenn das System eine geänderte Oberfläche erkennt – nach Abschluss eines Updates oder wenn die Oberfläche entsperrt wird – aktualisiert der Textur-Manager automatisch die Videospeicherkopie der Textur. Die aufgetretene Leistungssteigerung ähnelt dem erneuten Laden einer entfernten Textur.
Wenn Sie eine neue Ebene in einem Spiel eingeben, 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).