有时候需要知道stream output了多少个数据,这需要借助于DX10中的ID3D10Query,步骤如下:
- 创建D3D10_QUERY_DESC结构,设置D3D10_QUERY_DESC::Query为D3D10_QUERY_SO_STATISTICS,表明要调查的是SO的数据,设置D3D10_QUERY_DESC::MiscFlags为0;
- 通过ID3D10Device::CreateQuery()创建ID3D10Query;
- 用ID3D10Query::Begin()和ID3D10Query::End()函数包裹需要调查的SO代码;
- 通过ID3D10Query::GetData()获取SO的统计数据,填充在一个D3D10_QUERY_DATA_SO_STATISTICS
示例代码如下:
// 创建ID3D10Query ID3D10Query *d3dQuery; D3D10_QUERY_DESC d3dQueryDesc; d3dQueryDesc.Query = D3D10_QUERY_SO_STATISTICS; d3dQueryDesc.MiscFlags = 0; m_pD3DDevice->CreateQuery( &d3dQueryDesc, &d3dQuery ); // ...... ...... // 统计SO信息 d3dQuery->Begin(); // ......draw something with SO...... d3dQuery->End(); // ......最好在这里放置一些代码,填置CPU的空闲...... // 获取SO信息 D3D10_QUERY_DATA_SO_STATISTICS soData; while ( S_OK != d3dQuery->GetData( ( void* )&soData, sizeof( soData ), 0 ) );
值得注意的是,GetData一定要用while包裹,因为ID3D10Query从GPU获取数据是异步的(ID3D10Query继承自ID3D10Asynchronous)。这也是为什么最好能在GetData之前放置一些代码,因为CPU要等待GPU的数据,不如让CPU先去做些其他的事情,不要把CPU浪费在毫无意义的while循环等待上。
Recent Comments