(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.
相关主题