我正在编写一个带有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尝试释放设备时,会抛出一个错误,指出设备的引用计数大于零。
答案 0 :(得分:2)
每个网格都与设备相关联。该设备必须至少与网格一样长。
当您使用pMesh->Release()
释放网格时,在最终版本中,网格将被销毁。当发生这种情况时,Mesh将在设备上调用Release()
。这确保只要有网格,设备仍然存在。
无论是否使用系统或设备内存,它都应该如何工作。
网格不仅仅是一堆三角形 - 它是一组预先计算,调整,缓存和优化的三角形,用于在特定设备上显示。这就是为什么他们有一个参考设备 - 它是他们优化的设备。你不能把它们移到另一台设备上。
底线:引用计数必须是正确引用计数 - 它应该是对象引用的计数。由于每个Mesh都有一个对象的引用,因此在创建网格时引用计数应该增加是正确的,并且在销毁网格时减少引用计数。
如果您“控制”引用计数,结果将是不正确,并且会发生错误的事情。