DirectX - 每次调用 D3DXCreateTextureFromFile() 的新设备参考?

Posted

技术标签:

【中文标题】DirectX - 每次调用 D3DXCreateTextureFromFile() 的新设备参考?【英文标题】:DirectX - New Device Reference for each call to D3DXCreateTextureFromFile()? 【发布时间】:2012-12-17 09:11:29 【问题描述】:

我正在编写一个带有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 尝试释放设备时,会抛出一个错误,指出设备的引用计数大于零。

【问题讨论】:

【参考方案1】:

每个网格都与一个设备相关联。该设备必须至少与 Mesh 一样长。

当您使用pMesh->Release() 释放网格时,在最终版本中,网格将被销毁。发生这种情况时,Mesh 将依次调用设备上的Release()。这样可以保证只要有Mesh,设备就依然存在。

无论是使用系统内存还是设备内存,它都应该是这样工作的。

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

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

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

【讨论】:

谢谢...您的回答帮助我意识到了问题所在。处理网格、纹理和顶点缓冲区加载的类是一个静态类,在设备被 DXUT 释放后将被销毁。因此,该设备仍然具有每个对象的引用; DXUT 抛出错误,因为对象尚未释放...

以上是关于DirectX - 每次调用 D3DXCreateTextureFromFile() 的新设备参考?的主要内容,如果未能解决你的问题,请参考以下文章

对于 DirectX 11,我不能在每个渲染()中计算缓冲区吗?

DirectX 11 访问冲突

DirectX11--ComPtr智能指针

微软怎么没DirectX 11下载?只找到DirectX 9··官方网站下载位置是?

调试时不会加载 Directx 窗口

显卡上总说的directx 11 和游戏总说支持这个 到底啥意思 啥显卡支持directx呢 请详细讲讲 高分