Управление ресурсами (Direct3D 9)
Управление ресурсами — это процесс, при котором ресурсы переводятся из системной памяти в хранилище, доступное для устройств, и извлекаются из хранилища, доступного для устройств. Время выполнения Direct3D имеет собственный алгоритм управления на основе наименее недавно используемого метода приоритета. Direct3D переключается на самый недавно используемый метод приоритета при обнаружении того, что больше ресурсов, чем может сосуществовать в памяти, доступной для устройств, используются в одном кадре между вызовами IDirect3Device9::BeginScene и IDirect3Device9::EndScene.
Используйте флаг D3DPOOL_DEFAULT во время создания, чтобы указать, что ресурс помещается в пул памяти, наиболее подходящий для набора запрашиваемых использований данного ресурса. Обычно это память видео, включая локальную память видео и ускоренную память графического порта (AGP). Ресурсы в пуле по умолчанию не сохраняются в течение переходов между потерянными и рабочими состояниями устройства. Эти ресурсы необходимо освободить перед вызовом функции сброса, а затем создать заново.
Используйте флаг D3DPOOL_MANAGED во время создания, чтобы указать управляемый ресурс. Управляемые ресурсы сохраняются через переходы между потерянными и операционными состояниями устройства. Эти ресурсы существуют как в видео, так и в системной памяти. Управляемый ресурс будет скопирован в видеопамять, когда это необходимо для отрисовки. Устройство можно восстановить с помощью вызова IDirect3DDevice9::Reset, и такие ресурсы продолжают работать нормально без перезагрузки данных. Однако если устройство должно быть уничтожено и повторно создано, все ресурсы должны быть повторно созданы.
Управление ресурсами не рекомендуется для ресурсов, которые изменяются с высокой частотой. Например, буферы вершин и индексов, которые используются для обхода графа сцены, изменяются каждый кадр, отрисовывая только геометрию, видимую пользователю. Так как управляемые ресурсы поддерживаются системной памятью, постоянные изменения должны обновляться в системной памяти, что может привести к серьезному снижению производительности. Для этого конкретного сценария следует использовать D3DPOOL_DEFAULT вместе с D3DUSAGE_DYNAMIC.
Другим примером, для которого не рекомендуется управлять ресурсами (и явно не разрешено средой выполнения), является управление текстурой, созданной с помощью D3DUSAGE_RENDERTARGET. Если память, используемая целевыми объектами отрисовки, управлялась средой выполнения, её содержимое должно было бы постоянно копироваться в память системы во время рендеринга, что приводит к серьёзным ухудшениям производительности. По этой причине целевые объекты отрисовки должны быть созданы в пуле по умолчанию. Если требуется доступ к ЦП данных, содержащихся в целевом объекте отрисовки, данные должны быть скопированы в ресурс, созданный в D3DPOOL_SYSTEMMEM с помощью IDirect3DDevice9::UpdateTextureили IDirect3DDevice9::UpdateSurface
Дополнительные сведения об потерянном состоянии устройства см. в потерянных устройств (Direct3D 9).
Связанные разделы