時間 (Direct3D 12 圖形)
本節涵蓋查詢時間戳記,以及校正 GPU 和 CPU 時間戳計數器。
您的應用程式可以根據每個命令佇列查詢 GPU 時間戳記頻率, (參考 ID3D12CommandQueue::GetTimestampFrequency 方法) 。
傳回的頻率是以 Hz (ticks/sec) 來測量。 如果指定的命令佇列不支援時間戳記, (在 [ 查詢 ] 區段中看到資料表) ,則此 API 會失敗 (並傳回 E_FAIL) 。 D3D12_COMMAND_LIST_TYPE_DIRECT 和 D3D12_COMMAND_LIST_TYPE_COMPUTE 一律支援時間戳記。 如果D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported 成員為 TRUE,D3D12_COMMAND_LIST_TYPE_COPY選擇性地支援時間戳記。
D3D12 可讓應用程式將從時間戳記查詢取得的結果與從呼叫 QueryPerformanceCounter
取得的結果相互關聯。 呼叫 ID3D12CommandQueue::GetClockCalibration會啟用此功能。
在 GPU 完成上述所有工作負載時,GPU 會取樣時間戳記。 Direct3D 11 採用的行為相同, (請參閱 GitHub) 上 Direct3D 11.3 功能規格中的 D3D11_QUERY_TIMESTAMP 。 這表示時間戳記查詢是 Direct3D 12 中管道底端 () 作業。
GetClockCalibration 會取樣指定命令佇列的 GPU 時間戳記計數器,並透過幾乎同時取樣 CPU 計數器 QueryPerformanceCounter
。 同樣地,如果指定的命令佇列不支援時間戳記, (傳回 E_FAIL) (失敗, (請參閱 查詢 主題) 中的資料表。
請注意,GPU 和 CPU 時間戳計數器不一定與這些處理器的時脈速度直接相關,而是從時間戳記刻度運作。
您可以在命令清單 (取得時間戳記,而不是透過時間戳記查詢) 命令佇列上的 CPU 端呼叫。 (如需一般查詢的詳細資訊,請參閱 查詢) 。
所有時間戳記查詢都會針對實際查詢使用類型 D3D12_QUERY_TYPE_TIMESTAMP 。 不過,由於硬體限制,D3D12_COMMAND_LIST_TYPE_DIRECT和D3D12_COMMAND_LIST_TYPE_COMPUTE使用與D3D12_COMMAND_LIST_TYPE_COPY使用的不同D3D12_QUERY_HEAP_TYPE。
直接和計算佇列會使用 D3D12_QUERY_HEAP_TYPE_TIMESTAMP。
複製佇列會使用 D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP。
只有在 D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported 成員為 TRUE時,才支援複製佇列查詢。
時間戳記查詢一旦透過 ID3D12GraphicsCommandList::ResolveQueryData解析,即為代表刻度的 UINT64 ,如 ID3D12CommandQueue::GetClockCalibration所傳回,因此必須除以佇列頻率以秒為單位取得長度。
重要
針對精確度,在計算時間戳記的秒或毫秒間隔時,使用浮點算術。 例如,請使用 queriedTicks / (double)Frequency
,而不要使用 queriedTicks / Frequency
。