Pular para o conteúdo principal

Substituição das cadeias de troca pela apresentação direta e pelo agendamento de quadros

O Game OS reformulou o processo de apresentação gráfica. O objetivo é fazer o seguinte.
  • Fornecer um controle mais direto sobre a criação e o gerenciamento de recursos exibíveis
  • Reduzir a latência de ponta a ponta, desde a amostragem do dispositivo de entrada até a varredura do recurso de quadro apresentado
  • Ampliar a flexibilidade na configuração dinâmica de planos e parâmetros de exibição
  • Aumentar a liberdade na seleção da fila de comandos para o envio da apresentação
  • Estabelecer um mecanismo explícito de limitação da CPU para um controle refinado da execução do pipeline de simulação e renderização
  • Aprimorar a manutenção e o relatório de estatísticas do pipeline de quadros
Alguns dos recursos mais notáveis oferecidos pela nova abordagem são os seguintes.
  • A apresentação direta de objetos ID3D12Resource exibíveis permite versatilidade na organização e na seleção de recursos de troca, à medida que a cadeia evolui para um pool gerenciado pelo usuário.
  • A capacidade de apresentar em qualquer fila de comandos gráficos ou de computação pode eliminar uma paralisação da fila gráfica aguardando um fence de apresentação sinalizado por uma fila de computação após o processamento de um recurso de troca (suporte em breve).
  • Introdução de um método de identificação formal de quadros na forma de um token de pipeline. O token de pipeline de quadros fornece um meio de correlacionar a limitação de quadros, a amostragem de entrada, os eventos de gravação de listas de comandos da CPU, os eventos de renderização da GPU e os eventos do pipeline de exibição para quadros cujas durações de pipeline abrangem vários intervalos de v-sync. Estatísticas coerentes para quadros individuais podem então ser consultadas por token e exibidas por meio do PIX. O conhecimento do sistema sobre o tempo de vida de um quadro, incluindo todos os eventos notáveis que ocorrem nele, também beneficia o monitoramento e o ajuste do serviço XBOX Game Streaming.
  • Agendamento baseado em eventos e controlado por interrupções da produção de novos quadros para exibição, permitindo a especificação de tempos de origem no pipeline de quadros na cadência do intervalo de apresentação, com deslocamento automático de fase em resposta a quadros perdidos. O agendamento permite a especificação opcional de eventos criados pelo usuário para uma sinalização ampliada.
  • Sistema para sondar ou bloquear eventos de origem do pipeline de quadros como um mecanismo formal de limitação. O sistema permite a especificação opcional de eventos criados pelo usuário como condições adicionais para uma espera.
  • Expressão mais abstrata da frequência de renderização e apresentação, com o intervalo de apresentação especificado como uma duração de tempo em vez de um intervalo em v-blanks inteiros. A alteração permite preservar uma renderização de quadros consistente em hardware de console fixo diante de taxas de saída de tela variáveis (por exemplo, renderização a 60 Hertz em uma tela de 60 Hz ou de 120 Hz) e permite o suporte futuro simples à renderização nativa em frequências superiores a 60 Hz (por exemplo, 120 Hz nativos).
  • Ampliação das estatísticas de quadros rastreadas, com um mecanismo de relatório filtrável e extensível para adições futuras.
  • A identificação dos tempos de origem dos quadros, em conjunto com a futura adição de relógios sincronizados da tela e dos dispositivos de entrada (para evitar desvios contínuos), permite que a plataforma oriente a coleta de amostras de entrada pelo firmware do gamepad (ou de outro dispositivo) e a disponibilidade just-in-time para consultas do jogo, ajudando a minimizar a latência geral.

Migração do Windows e da ERA

As APIs relacionadas a cadeias de troca, apresentação e agendamento sem suporte no Game OS têm equivalentes comparáveis. Como auxílio de orientação, um conjunto de APIs e parâmetros herdados comumente usados é fornecido na tabela a seguir, com suas substituições correspondentes na coluna adjacente.

Fluxo de trabalho de alto nível

A abordagem geral para criar um pool de recursos exibíveis, agendar quadros como um mecanismo explícito de limitação e apresentar recursos de quadro na tela consiste em algumas etapas de inicialização, seguidas por uma sequência de operações no loop do jogo. Para obter mais informações sobre cada etapa (descrições detalhadas, implicações e uso sugerido), consulte as páginas de referência. Inicialização
  • Chame ID3D12Device::CreateCommittedResource com HeapFlags que incluam D3D12_HEAP_FLAG_ALLOW_DISPLAY para criar uma coleção de objetos ID3D12Resource que servirão como um pool de recursos trocáveis com suporte à apresentação na tela (ou seja, uma “cadeia de troca”).
  • Chame ID3D12Device::SetFrameIntervalX para estabelecer uma taxa de atualização e um período de quadros. LengthInMicroseconds define o intervalo de tempo entre as apresentações de quadros na tela (flips). PeriodInIntervals define o quanto a CPU pode se adiantar em relação à GPU, em intervalos de quadros inteiros. A CPU pode se adiantar PeriodInIntervals - 1 quadros em relação à GPU antes de ser limitada (por exemplo, um PeriodInIntervals de 2 permite que a CPU grave e envie comandos de renderização para o quadro n + 1 enquanto a GPU processa os comandos enviados para o quadro n).
  • Chame ID3D12Device::ScheduleFrameEventX para estabelecer o momento, dentro de um intervalo de quadros, em que a CPU será limitada. Especifique um Type D3D12XBOX_FRAME_EVENT_ORIGIN e um deslocamento de tempo IntervalOffsetInMicroseconds para agendar o evento de origem dos quadros. A CPU é limitada até que a quantidade de tempo IntervalOffsetInMicroseconds especificada dentro do intervalo tenha decorrido.
Loop do jogo
  • Chame ID3D12Device::WaitFrameEventX com um Type D3D12XBOX_FRAME_EVENT_ORIGIN para executar a limitação da CPU. Especifique um TimeOutInMs de D3D12XBOX_WAIT_FRAME_EVENT_INFINITE para bloquear até que a origem chegue, ou um tempo limite fixo em milissegundos para sondar o evento de origem (S_FALSE será retornado se a origem ainda não tiver chegado). Especifique um ponteiro para um D3D12XBOX_FRAME_PIPELINE_TOKEN em pToken que, ao retornar com a chegada da origem, é definido como um valor de token que identifica exclusivamente o quadro. Esse token deve ser rastreado para o quadro e fornecido no momento de sua apresentação na tela.
  • Consulte a entrada do controle e renderize o quadro nos objetos ID3D12Resource criados com suporte à exibição.
  • Chame ID3D12CommandQueue::PresentX para enfileirar os recursos do quadro renderizado para apresentação na tela. Os recursos e os tokens de quadro são fornecidos na matriz pPlaneParameters.
  • Chame ID3D12Device::GetFrameStatisticsX usando o token do último quadro que deveria ter chegado à tela (ou faça várias chamadas para diferentes quadros de interesse). Analise as estatísticas de quadros retornadas para orientar as atualizações do ponto de limitação de quadros estabelecido, com o objetivo de minimizar a latência entre a entrada do controle e a exibição. Chame ID3D12Device::ScheduleFrameEventX com o tipo D3D12XBOX_FRAME_EVENT_ORIGIN para executar as atualizações, que serão aplicadas quando o próximo quadro a ser apresentado após a chamada for invertido para a tela.
  • Execute qualquer trabalho independente de entrada na CPU/GPU antes de prosseguir para aguardar a próxima origem de quadro (ou enquanto a sonda).

Código de exemplo

O exemplo de código a seguir demonstra o fluxo de trabalho de alto nível para uma renderização a 60 FPS em 1080p, com um único plano de fundo e um pool de troca de 2 recursos.
Última modificação em 6 de outubro de 2026