Я пишу программу с DirectX API. Я начинаю использовать DXUT. У меня возникают проблемы при попытке контролировать количество ссылок на устройство DirectX. Кажется, что каждый раз, когда я вызываю D3DXCreateMesh (), D3DXCreateTextureFromFile () или IDirect3DDevice9 :: CreateVertexBuffer (), ссылка на устройство добавляется. Я пытался использовать флаги «SYSTEMMEM» для хранения вновь созданного объекта (меша, текстуры или буфера вершин) в системной памяти, а не для хранения его в выделении устройства. Вот пример вызова, который добавил ссылку на устройство …
DWORD dwNumFaces = 1, dwNumVertices = 3, dwOptions |= D3DXMESH_SYSTEMMEM;
D3DVERTEXELEMENT9 mesh_decl
{
...
}
ID3DXMESH *pMesh = NULL;
D3DXCreateMesh(dwNumFaces, dwNumVertices, dwOptions, mesh_decl, m_pd3dDevice, &pMesh);
Любые идеи или ссылки на информацию по этому вопросу? Этого следовало ожидать? До сих пор было принято решение освободить устройство (m_pd3dDevice-> Release ()) непосредственно после каждого вызова вышеуказанных функций. Когда DXUT пытается освободить устройство, выдается ошибка, в которой говорится, что счетчик ссылок для устройства больше нуля.
Каждая сетка связана с устройством. Устройство должно жить хотя бы столько же, сколько Mesh.
Когда вы отпускаете сетку с pMesh->Release()
В последнем выпуске сетка будет уничтожена. Когда это произойдет, Mesh по очереди вызовет Release()
на устройстве. Это гарантирует, что пока существует сетка, устройство все еще будет существовать.
Вот как это должно работать, независимо от того, используется ли память системы или устройства.
Сетка — это не просто набор треугольников — это набор треугольников, которые предварительно рассчитаны, настроены, кэшированы и оптимизированы. для отображения на определенном устройстве. Вот почему у них есть ссылка на устройство — это устройство, для которого они оптимизированы. Вы не можете просто перенести их на другое устройство.
Нижняя линия: Счетчик ссылок должен быть правильный счетчик ссылок — это должен быть счетчик ссылок на объект. Поскольку каждая сетка имеет ссылку на объект, правильно, что счетчик ссылок должен увеличиваться при создании сетки и уменьшаться при ее разрушении.
Если вы «контролируете» счетчик ссылок, результатом будет то, что он будет некорректный, и плохие вещи будут происходить.
Других решений пока нет …