是否有使用Direct3D与COM的参考?

时间:2014-01-10 20:19:23

标签: c++ windows com direct3d

我指的是“非托管”/桌面C ++目标应用程序的所有MSDN教程如何在Direct3D是COM接口的情况下不使用甚至提及COM。我是 new 到这个游戏并通过大量搜索(包括阅读其他目标的其他MSDN文档 - 如RT)我已经确定我肯定应该使用COM助手。

我找到了COM智能指针的引用(_com_ptr_t是它的伴侣_COM_SMARTPTR_TYPEDEF),但仅此而已。

我还需要知道多少COM才能使用它? MSDN上的Direct3D教程的要求只是说明了C ++的经验和数学。

我不认为我对使用哪个智能指针感到困惑(因为这是另一个常见问题),但我担心作为一个新的COM程序员可能还有其他VITAL信息我不知道。

此外,显然其他COM接口为程序员定义了自己的指针typedef。这对Direct3D也有效吗?现在我只是使用_COM_SMARTPTR_TYPEDEF并定义我自己的。

1 个答案:

答案 0 :(得分:0)

我个人建议在ComPtr中使用wrl.h作为智能COM指针。对于D3D,除了通过AddRefRelease管理对象生命周期的方式以及知道何时使用偶尔的QueryInterface之外,你真的不需要知道很多COM(例如,从ID3D11Debug获取ID3D11Device。 D3D11唯一特有的是D3D对象的生命周期是其实际COM生命周期中的较大者(即引用计数大于零的周期),以及它或其依赖关系存在或绑定到D3D的时间段管道

例如:

CreateTexture(&tex) // tex refcount = 1
CreateShaderResourceView(tex, &srv) // srv refcount = 1, tex internal refcount = 2
tex->Release() // tex refcount = 0, internal refcount = 1 (so not released)
srv->Release() // srv refcount = 0, released; tex internal refcount = 0, released

当然,智能指针会在复制对象引用或超出范围时自动调用AddRefRelease。如果您不熟悉API并且不想担心忘记发布内容,那么他​​们绝对是个好主意(D3D的内部参考跟踪可确保您无法删除目前正在使用的东西)。但是对于更高级的程序,您希望更精确地定位对象分配和释放(而不仅仅是范围更改),因此需要手动管理它。