понедельник, 22 марта 2010 г.

Подсчет ссылок в D3D8 и D3D9

Казалось бы что может быть сложного, на AddRef() увеличиваем кол-во ссылок, в Release() уменьшаем. Но в Diretct3D 8 и 9, как обычно, не все так просто и чтобы создать полноценный Direct3D Wrapper необходимо это все учитывать, иначе некоторые игры начнут с ни падать.

Вот некоторые особенности:
  • Автоматически созданные IDirect3DDevice9 ресурсы (BackBuffer, автоматически созданный depth-stencil surface, основной SwapChain) нельзя удалить, т.е. Release() можно вызывать хоть до бесконечности он будет возвращать кол-во ссылок 0 и не удалит ресурс.
  • Само устройство не увеличивает кол-во ссылок на автоматически созданные ресурсы.
  • Пока ресурс забинджен в устройство (с помощью SetTexture, SetRenderTarget или SetDepthStencilSurface) его нельзя удалить, при попытке удалить его счетчик ссылок не будет опускать ниже 0. После того устройство освободит ресурс если кол-во ссылок ресурса равно нулю он будет удален.
  • У текстуры и её поверхностей общий счетчик ссылок.
Вот так то :-)

2 комментария:

Евгений Коростелев комментирует...

А зачем создавать враппер тем более на Direct3D8? В качестве враппера можно использовать Direct3D11 и feature levels :)

Dragon комментирует...

Полный враппер обычно нужен для других целей, при создание различных утилит наподобие Microsoft PIX, NVidia PerfHUD или наш iZ3D стереодрайвер. Чтобы перехватив вызов создания D3D устройства, вернуть игре вместо оригинального устройства наш враппер.