Udostępnij przez


Zarządzanie czasem (grafika Direct3D 12)

W tej sekcji opisano wykonywanie zapytań dotyczących sygnatur czasowych oraz kalibrowanie liczników sygnatur czasowych procesora GPU i procesora CPU.

Częstotliwość znacznika czasu

Aplikacja może wykonywać zapytania dotyczące częstotliwości znacznika czasowego procesora GPU dla każdej kolejki poleceń z osobna (zapoznaj się z metodą ID3D12CommandQueue::GetTimestampFrequency).

Zwracana częstotliwość jest mierzona w Hz (cykli/s). Jeśli określona kolejka poleceń nie obsługuje sygnatur czasowych (zobacz tabelę w sekcji Queries), ten interfejs API kończy się niepowodzeniem (i zwraca E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT i D3D12_COMMAND_LIST_TYPE_COMPUTE zawsze obsługują znaczniki czasu. D3D12_COMMAND_LIST_TYPE_COPY opcjonalnie obsługuje znaczniki czasu, jeśli członek D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported jest TRUE.

Kalibracja znacznika czasu

D3D12 umożliwia aplikacjom korelowanie wyników uzyskanych z zapytań sygnatur czasowych z wynikami uzyskanymi z wywołania QueryPerformanceCounter. Jest to włączone przez wywołanie ID3D12CommandQueue::GetClockCalibration.

Znacznik czasu jest pobierany przez procesor GPU w momencie, gdy GPU ukończy wszystkie poprzednie zadania. Jest to to samo zachowanie przyjęte przez direct3D 11 (zobacz D3D11_QUERY_TIMESTAMP w specyfikacji funkcjonalnej Direct3D 11.3 w usłudze GitHub). Oznacza to, że zapytania znacznika czasowego są operacją u dołu potoku (BOP) w Direct3D 12.

GetClockCalibration próbuje pobrać próbki licznika czasu GPU dla danej kolejki poleceń i pobiera próbki licznika czasu CPU za pośrednictwem QueryPerformanceCounter w niemal tym samym czasie. Ponownie ten interfejs API kończy się niepowodzeniem (zwracanie E_FAIL), jeśli określona kolejka poleceń nie obsługuje sygnatur czasowych (zobacz tabelę w temacie zapytań).

Należy pamiętać, że liczniki znaczników czasu procesorów GPU i CPU nie muszą być bezpośrednio związane z częstotliwością taktowania tych procesorów, lecz działają na podstawie odczytów znaczników czasu.

Zapytania znaczników czasu

Znaczniki czasu można uzyskać w ramach listy poleceń (zamiast wywołania po stronie procesora CPU w kolejce poleceń) za pośrednictwem zapytań znacznika czasu. (Aby uzyskać więcej informacji na temat zapytań, zobacz Zapytania).

Wszystkie zapytania znacznika czasu wykorzystują typ D3D12_QUERY_TYPE_TIMESTAMP do rzeczywistego zapytania. Jednak ze względu na ograniczenia sprzętu D3D12_COMMAND_LIST_TYPE_DIRECT i D3D12_COMMAND_LIST_TYPE_COMPUTE używają innego D3D12_QUERY_HEAP_TYPE niż ten używany przez D3D12_COMMAND_LIST_TYPE_COPY.

Kolejki bezpośrednie i obliczeniowe używają D3D12_QUERY_HEAP_TYPE_TIMESTAMP.

Kolejki kopiowania używają D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.

Zapytania kolejki kopiowania są obsługiwane tylko wtedy, gdy element członkowski D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported jest true.

Zapytania sygnatury czasowej, po rozwiązaniu za pośrednictwem ID3D12GraphicsCommandList::ResolveQueryData, są UINT64, które reprezentują znaczniki, jak jest zwracane przez ID3D12CommandQueue::GetClockCalibration, i jako takie muszą być podzielone przez częstotliwość kolejki, aby uzyskać długość w sekundach.

Ważny

Aby uzyskać dokładność, użyj arytmetyki zmiennoprzecinkowych podczas obliczania interwałów sekund lub milisekund sygnatur czasowych. Na przykład użyj queriedTicks / (double)Frequency zamiast queriedTicks / Frequency.

liczniki i zapytania

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

pomiar wydajności