本節涵蓋查詢時間戳,以及校正 GPU 和 CPU 時間戳計數器。
時間戳頻率
您的應用程式可以根據每個命令佇列查詢 GPU 時間戳頻率(請參閱 ID3D12CommandQueue::GetTimestampFrequency 方法)。
傳回的頻率是以 Hz 測量(刻度/秒)。 如果指定的命令佇列不支持時間戳(請參閱 查詢 一節中的數據表),則此 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 時間戳計數器,並幾乎同時透過 QueryPerformanceCounter 取樣 CPU 計數器。 同樣,如果指定的命令佇列不支援時間戳記,此 API 會失敗(返回 E_FAIL)。如需詳細資訊,請參閱 查詢 主題中的表格。
請注意,GPU 和 CPU 時間戳計數器不一定與這些處理器的時鐘速度直接相關,而是從時間戳刻度運作。
時間戳查詢
您可以透過時間戳查詢,取得時間戳作為命令清單的一部分(而不是命令佇列上的 CPU 端呼叫)。 (如需查詢的詳細資訊,請參閱 查詢)。
所有時間戳查詢都會針對實際查詢使用類型 D3D12_QUERY_TYPE_TIMESTAMP。 不過,由於硬體限制,D3D12_COMMAND_LIST_TYPE_DIRECT 和 D3D12_COMMAND_LIST_TYPE_COMPUTE 使用的 D3D12_QUERY_HEAP_TYPE 與 D3D12_COMMAND_LIST_TYPE_COPY 使用的不同。
直接與計算隊列使用 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。