c++ - DirectX - 每次调用 D3DXCreateTextureFromFile() 的新设备引用?

标签 c++ winapi interface directx iunknown

我正在编写一个带有 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()。这样就保证了只要有Mesh,设备就一直存在。

这就是它应该如何工作,无论是否使用系统或设备内存。

网格不仅仅是一堆三角形 - 它是一堆经过预先计算、调整、缓存和优化的三角形,可以在特定设备上显示。这就是他们引用设备的原因——这是他们优化的设备。您不能只是将它们移动到另一台设备。

底线:引用计数必须是正确的引用计数 - 它应该是对对象的引用计数。由于每个 Mesh 都有对对象的引用,因此创建网格时引用计数应该增加,销毁时引用计数应该减少是正确的。

如果您“控制”引用计数,结果将是它不正确,并且会发生坏事。

关于c++ - DirectX - 每次调用 D3DXCreateTextureFromFile() 的新设备引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13911183/

相关文章:

c++ - 一个数的2个因数组成一组有多少种方法? (C/C++)

c++ - 是否有基于参数设置变量的约定?

c++ - 仅刷新文件元数据

java - 扩展多个类的解决方案

c++ - 右值委托(delegate),或 const 成员函数的右值等价物

php - 树莓派和本地连接(无云)spark 核心之间的合适协议(protocol)

windows - 如何确定鼠标在两次单击之间允许的移动量以触发 WM_LBUTTONDBLCLK 消息?

c++ - Win32 : Modal dialog not returning focus

python - python中可以使用函数指针来减少类之间的依赖关系吗?

java - 实现接口(interface)的名称冲突