如果没有任何性能成本,应用程序可以对驱动程序进行许多有趣的查询。 在 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.
相关主题