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