Должен ли я вызвать Release на интерфейсе ID3D10Device после использования CreateTexture2D? Зачем? - PullRequest
0 голосов
/ 18 января 2012

У меня есть этот код в проекте Directx10.

ID3D10Texture2D *depthStencilBuffer;
UINT a = m_device->Release();
if(FAILED(hr = m_device->CreateTexture2D( &descDepth, NULL, &depthStencilBuffer ))) {
    DXGI_D3D10_ErrorExit(hr, L"CreateTexture2D");
    return hr;
}
a = m_device->Release();

Теперь, если я останавливаю отладчик в третьей строке и проверяю значение a, он говорит 2. И когда я останавливаю его в строке после последней, она говорит 3. Я не могу понять почему. Добавляет ли функция CreateTexture2D ссылки на интерфейс ID3D10Device? И, очевидно, он даже не добавляет одну ссылку, а две из них, поскольку Release() уменьшает одну. Моя проблема в документации для ID3D10Device::CreateTexture2D не указывает, что он добавляет ссылки на объект ID3D10Device. То же самое относится и к ID3D10Device::CreateRenderTargetView. Как мне угадать, когда позвонить Release?

1 Ответ

2 голосов
/ 19 января 2012

У меня нет возможности установить DirectX SDK atm для проверки этого, но, в целом, когда дело доходит до COM, вы должны следовать правилам COM и полагать, что другие объекты также следуют правилам.

т.е. вы не должны знать о реализации Texture2D, но вы должны верить, что, если ему понадобится добавить ссылки на устройство, он также удалит их, когда это будет сделано.Вы не должны пытаться делать дополнительные вызовы Release ().

Ваш код должен выглядеть следующим образом:

ID3D10Texture2D *depthStencilBuffer = NULL;
if(FAILED(hr = m_device->CreateTexture2D( &descDepth, NULL, &depthStencilBuffer ))) {
    DXGI_D3D10_ErrorExit(hr, L"CreateTexture2D");
    return hr;
}
depthStencilBuffer->Release();
depthStencilBuffer = NULL;

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

...