IDirect3DQuery9 *pFreq = nullptr;
HRESULT hRetval = pD3DDevice->CreateQuery(D3DQUERYTYPE_TIMESTAMPFREQ,&pFreq);
if (FAILED(hRetval))
{
m_dGPUTimeFrequency = 0.0;
// Not available
return false;
}
pFreq->Issue(D3DISSUE_END); // Issue query
// Get response
UINT64 uFreq = 0;
while (S_FALSE == pFreq->GetData(&uFreq,sizeof(uFreq),D3DGETDATA_FLUSH));
pFreq->Release();
if (!uFreq)
return false;
m_dGPUTimeFrequency = 1.0 / (double)uFreq * 1000.0; // To milliseconds
for (DWORD i=0;i<3;i++)
{
pD3DDevice->CreateQuery(D3DQUERYTYPE_TIMESTAMP,&m_aStartTimers[i]);
pD3DDevice->CreateQuery(D3DQUERYTYPE_TIMESTAMP,&m_aEndTimers[i]);
}
m_aStartTimers[dwIssueSlot]->Issue(D3DISSUE_END);
m_aEndTimers[dwIssueSlot]->Issue(D3DISSUE_END);
const DWORD dwReadSlot = m_dwCurrentReadSlot%kMaxBufferedFrames;
UINT64 uEndTime = 0;
if (m_aEndTimers[dwReadSlot]->GetData(&uEndTime,sizeof(uEndTime),0) != S_OK)
return false; // No new reading yet
UINT64 uStartTime = 0;
m_aStartTimers[dwReadSlot]->GetData(&uStartTime,sizeof(uStartTime),0);
UINT64 uTimeDiff = uEndTime - uStartTime;
m_fLastFrameTime = (float)((double)uTimeDiff * m_dGPUTimeFrequency);
gpuTimer.Begin();
pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, ...);
gpuTimer.End();
float fTimeMS = 0;
bool valueIsReady = gpuTimer.GetValueIfReady(fTimeMS);
وفي 06/جمادى الثانية/1433 02:51 ص، أعرب 16mofed84 عن رأيه بالموقف كالآتي:
مشكور جداً وجدت كود للxna مشابه وهو occlusion queriesوهو يعطي عدد ال pixels. المرسومة وهو مشابه لما ذكرته فيه begin endلكن هل يمكن قياس الوقت به ؟في 06/جمادى الثانية/1433 06:13 ص، قال سلوان الهلالي بهدوء وتؤدة:
السلام عليكم،