异步通知 (Direct3D 9)

如果没有任何性能成本,应用程序可以对驱动程序进行许多有趣的查询。 在 Direct3D 7 和 Direct3D 8 中,同步查询机制 GetInfo 适用于统计信息等内容,但没有添加性能关键查询。 还有其他一些东西(如围栏)本质上是异步的。 这是一个简单的 API,用于进行同步和异步查询。 GetInfo 将在 Direct3D 9 中停用。

使用 IDirect3DDevice9::CreateQuery创建查询。 此方法采用D3DQUERYTYPE,它定义要进行的查询类型,并返回指向 IDirect3DQuery9 对象的指针。 如果不支持查询类型,则调用将返回错误D3DERR_NOTAVAILABLE。 使用查询对象,应用程序使用 IDirect3DQuery9::Issue将查询提交到运行时,并使用 IDirect3DQuery9::GetData轮询查询状态。 如果查询结果可用,则返回S_OK;否则,将返回S_FALSE。 应用程序应为查询结果传递适当大小的缓冲区。

应用程序可以选择强制运行时将查询刷新到驱动程序,方法是将D3DGETDATA_FLUSH与 IDirect3DQuery9::GetData配合使用。 这会导致刷新,迫使驱动程序查看查询。 在这种情况下,如果设备丢失,则返回D3DERR_DEVICELOST。

当设备丢失时,所有查询都会丢失,应用程序必须重新创建它们。 如果设备不支持查询,并且 pQueryID NULL,则查询创建将失败并D3DERR_INVALIDCALL。

下表总结了有关每个查询类型的重要信息。

QuertyType 有效问题标志 GetData 缓冲区 运行 隐式查询开头
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE 零售/调试 CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager 仅调试 目前
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS 仅调试 目前
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL 零售/调试 CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN,D3DISSUE_END DWORD 零售/调试 N/A

 

IDirect3DQuery9::Issue的标志字段:

#define D3DISSUE_END (1 << 0) 
// Tells the runtime to issue the end of a query, changing its state to 
//   "non-signaled" 
 
#define D3DISSUE_BEGIN (1 << 1) // Tells the runtime to issue the 
// beginning of a query. 

IDirect3DQuery9::GetData的标志字段:

 
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush 
// if the query is outstanding.

编程提示