Поделиться через


Автоматическое управление текстурами (Direct3D 9)

Управление текстурами — это процесс определения необходимых текстур для отрисовки в определенное время и обеспечения загрузки этих текстур в память видео. Как и в случае с любым алгоритмом, схемы управления текстурами зависят от сложности, но любой подход к управлению текстурами включает следующие ключевые задачи.

  • Отслеживание объема доступной памяти текстуры.
  • Вычисление текстур, необходимых для отрисовки, и которые не нужны.
  • Определение существующих ресурсов текстуры, которые можно перезагрузить с помощью другого изображения текстуры, и какие поверхности должны быть уничтожены и заменены новыми ресурсами текстуры.

Direct3D реализует системное управление текстурами, чтобы гарантировать, что текстуры загружаются для оптимальной производительности. Ресурсы текстур, управляемые Direct3D, называются управляемыми текстурами.

Диспетчер текстур отслеживает текстуры с меткой времени, которая определяет время последнего использования текстуры. Затем он использует наименее недавно используемый алгоритм, чтобы определить, какие текстуры следует удалить. Приоритеты текстур используются в качестве разбиения связей, когда две текстуры предназначены для удаления из памяти. Если две текстуры имеют одно и то же значение приоритета, удаляется наименее недавно используемая текстура. Однако если две текстуры имеют одинаковую метку времени, то сначала удаляется текстура с более низким приоритетом.

Вы запрашиваете автоматическое управление текстурами для поверхностей текстур при их создании. Чтобы получить управляемую текстуру в приложении C++, создайте ресурс текстуры, вызвав IDirect3Device9::CreateTexture и указав D3DPOOL_MANAGED для параметра пула. Невозможно указать место создания текстуры. При создании управляемой текстуры нельзя использовать флаги D3DPOOL_DEFAULT или D3DPOOL_SYSTEMMEM. После создания управляемой текстуры можно вызвать метод IDirect3DDevice9::SetTexture, чтобы настроить его на стадию каскада текстуры устройства отрисовки.

Вы можете назначить приоритет управляемым текстурам, вызвав метод IDirect3DResource9::SetPriority для поверхности текстуры.

Direct3D автоматически загружает текстуры в память видео по мере необходимости. Система может кэшировать управляемые текстуры в локальной или нелокальной памяти видео в зависимости от доступности нелокальной памяти видео или других факторов. Расположение кэша управляемых текстур не передается приложению и не требуется для использования автоматического управления текстурами. Если приложение использует больше текстур, чем может быть в памяти видео, Direct3D удаляет старые текстуры из памяти видео, чтобы освободить место для новых текстур. Если вы снова используете удаленную текстуру, система использует исходную поверхность текстуры памяти системы для перезагрузки текстуры в кэше видео-памяти. Хотя требуется перезагрузить текстуру, она также снижает производительность приложения.

Вы можете динамически изменить исходную копию текстуры в системной памяти, обновив или заблокировав ресурс текстуры. Когда система обнаруживает грязную поверхность - после завершения обновления или при разблокировке поверхности - диспетчер текстур автоматически обновляет копию текстуры. Снижение производительности аналогично перезагрузке удаленной текстуры.

При вводе нового уровня в игре может потребоваться удалить все управляемые текстуры из памяти видео (вызывая IDirect3Device9::EvictManagedResources).

Дополнительные сведения об управлении ресурсами см. в управлении ресурсами (Direct3D 9).

Текстуры Direct3D