(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 零售/调试 空值

 

IDirect3DQuery9::Issue 的 Flags 字段:

#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.

编程提示