← SEARCHABLE ARCHIVE
DirectX 12 · 2026-07-11

Cola de comandos y valla DX12

Sincronice CPU y GPU en el momento adecuado

INTERACTIVE READING MODE →

Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.

En DirectX 12, la CPU registra la lista de comandos y la GPU la ejecuta posteriormente. Dado que los dos dispositivos se mueven al mismo tiempo, deben sincronizarse para que la CPU no sobrescriba los recursos que aún utiliza la GPU.

Cola de comandos y lista de comandos

La lista de comandos es una lista que registra los comandos de dibujo y la cola de comandos envía la lista completa a la GPU.

CPU
Inicialización de CommandAllocator
Historial de lista de comandos
CommandList Close
        ↓
Enviar cola de comandos
        ↓
Ejecución de GPU

CommandAllocator gestiona la memoria necesaria para la grabación. El mismo asignador no debe restablecerse mientras la GPU todavía esté leyendo las instrucciones del fotograma anterior.

Verifique el tiempo de finalización con Fence

void WaitForGPU()
{
    const UINT64 SignalValue = ++FenceValue;
    CommandQueue->Signal(Fence, SignalValue);

    if (Fence->GetCompletedValue() < SignalValue)
    {
        Fence->SetEventOnCompletion(SignalValue, FenceEvent);
        WaitForSingleObject(FenceEvent, INFINITE);
    }
}

Cuando se ingresa un valor de Señal en la Cola, la GPU procesa todos los comandos anteriores y luego actualiza el valor de Cerca. La CPU espera un evento solo cuando el valor de finalización es menor que el objetivo.

Es lento si esperas cada fotograma.

En el ejemplo del triángulo, para que sea más fácil de entender,WaitForGPU()se puede llamar. Sin embargo, si hace esto, la CPU y la GPU no pueden funcionar juntas y ejecutar en serie cada cuadro.

En la práctica, hay tantos recursos de fotograma como número de BackBuffers y el valor de valla de cada fotograma se registra por separado.

struct FrameContext
{
    ComPtr<ID3D12CommandAllocator> Allocator;
    UINT64 FenceValue = 0;
};

Solo espera a que se utilice actualmente el límite del recurso de fotograma y permite que la GPU continúe procesando otros fotogramas.

Activar capa de depuración

En DX12, los desarrolladores son directamente responsables de las transiciones de estado incorrectas o del uso de descriptores. Si activa la capa de depuración antes de la inicialización, podrá descubrir qué estado de recurso y orden de comando son incorrectos mucho más rápido.

El objetivo de la sincronización DX12 no es esperar incondicionalmente. Permite que la CPU y la GPU funcionen tanto como sea posible al mismo tiempo, mientras esperan precisamente volver a utilizar los mismos recursos.