функции Direct3D VertexBuffer Lock () и Unlock (), реализованные различными D3DPOOL - PullRequest
0 голосов
/ 10 декабря 2011

у IDirect3DVertexBuffer9 есть методы

STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) PURE
STDMETHOD(Unlock)(THIS) PURE

Я не знаю внутреннюю реализацию этих функций. Я ожидаю следующего.

  1. Метод «Блокировка» отображает видеопамять VertexBuffer в ppbData. это значительно улучшает производительность.

  2. Метод 'Lock' выделяет системную запись и создает ppbData для ее указания. И метод «UnLock» копирует эту память в реальную видеопамять. этот подход путем размещения уровня абстракции в аппаратном обеспечении устраняет различия.

Я думаю, что: в режиме «D3DPOOL_SYSTEMMEM» это реализовано способом 2. в режиме «D3DPOOL_DEFAULT» это реализовано способом 1.

/* Pool types */
typedef enum _D3DPOOL {
    D3DPOOL_DEFAULT                 = 0,
    D3DPOOL_MANAGED                 = 1,
    D3DPOOL_SYSTEMMEM               = 2,
    D3DPOOL_SCRATCH                 = 3,

    D3DPOOL_FORCE_DWORD             = 0x7fffffff
} D3DPOOL;

но я не знаю, как это реализовано в каждом режиме D3DPOOL. помоги мне ~~

1 Ответ

3 голосов
/ 11 декабря 2011

В D3DPOOL_DEFAULT содержимое буфера теряется, когда полноэкранное устройство теряет фокус, а устройство «теряется» (D3DERR_DEVICENOTRESET или D3DERR_DEVICELOST).В этом случае ожидается, что данные в буфере будут храниться в видеопамяти.

В D3DPOOL_MANAGED копия данных (которая хранится в видеопамяти) сохраняется в системной памяти, и в результате драйвер восстанавливает ее при потере устройства.

D3DPOOL_SCRATCH не поддерживается для буферов вершин.

D3DPOOL_SYSTEMMEM, не будет гарантировать лучшую производительность, потому что вы будете часто - передавать данные из системной памяти в видеопамять, чтобы использовать этот буфер вершин,Для лучшей производительности в буферах, которые часто обновляются, есть динамические вершинные буферы (см. D3DUSAGE_DYNAMIC, D3DLOCK_DISACRD, D3DLOCK_NOOVERWRITE), которые расположены в D3DPOOL_DEFAULT.Также в документации Direct3D9 говорится, что ресурсы, созданные в системной памяти, обычно недоступны для устройства D3D9.Для рендеринга из системной памяти существуют DrawIndexedPrimitiveUP и DrawPrimitiveUP, которые обязательно вызовут проблемы на чистом устройстве D3D9.

Кроме того, нет абсолютно никакой гарантии, что любой флаг заставит устройство работать так, как вы думаете.Если здравый смысл говорит вам, что он должен работать таким образом, но это не задокументировано в спецификации, согласно закону Мерфи, это, вероятно, не работает так, как должно.Для всех практических целей реализация драйвера может быть написана безумным безумцем, если она соответствует спецификации Direct3D.

Другое дело, что эти функции задокументированы.DirectX SDK поставляется с несколькими файлами справки - * .chm, которые можно прочитать в любой системе Windows, .HxI / .HxS, которые интегрируются в Visual Studio, плюс есть интерактивная справка по MSDN ,который включает в себя объяснение D3DPOOL .Если вы задаете такие вопросы, вы не сделали домашнее задание и не читали документацию.Так что продолжайте и читайте это.Если документация Direct3D9 больше не включена в последний SDK, просто установите ее более старую версию (лето 2004 года).

...