- Eventos de suspensão e retomada
- Implicações para o agendamento de quadros e as estatísticas
- Padrão de chamada
- Teste
Eventos de suspensão e retomada
No XBOX One, os aplicativos do Game OS podem ser suspensos e retomados pelo gerenciamento do tempo de vida do processo (PLM). No estado suspenso, a memória do aplicativo permanece intacta, mas o aplicativo não tem recursos de CPU nem de GPU. Um dos Requisitos do XBOX (XRs) para o XBOX One é que os aplicativos do Game OS implementem suspensão e retomada. Se um aplicativo receber o evento Suspending, ele deverá chamar SuspendX. Caso contrário, o aplicativo será encerrado. As chamadas SuspendX e ResumeX devem operar no thread de renderização do título para garantir que o estado da GPU seja salvo corretamente pela chamada SuspendX. Quando o título está suspenso, ele não pode renderizar nada até que a GPU seja retomada. Chamar qualquer API do Direct3D entre as chamadas SuspendX e ResumeX do Direct3D, como os métodos ID3D12GraphicsCommandList::DrawInstanced ou ID3D12CommandQueue::ExecuteCommandLists, gera uma exceção. Veja a seguir os métodos de suspensão e retomada do Direct3D no XBOX One. Esses métodos devem ser invocados na fila de comandos gráficos, pois não são compatíveis com filas de computação e de cópia.Implicações para o agendamento de quadros e as estatísticas
A suspensão do aplicativo introduz uma interrupção não determinística no agendamento de quadros estabelecido. Considerando a natureza imprevisível do momento em que um evento de suspensão pode ocorrer, não é possível que o sistema restaure com segurança o agendamento estabelecido e seu estado temporal após o evento de retomada subsequente. Para oferecer um comportamento robusto e previsível, o agendamento de quadros do aplicativo é limpo pelo sistema durante o processamento da chamada SuspendX. A fila de apresentação é liberada para a tela, e todos os quadros iniciados por WaitFrameEventX, mas ainda não enviados à tela por meio de PresentX, são descartados. Consequentemente, após retornar da chamada ResumeX, o aplicativo deve restabelecer o agendamento de quadros desejado por meio de chamadas para ID3D12Device::SetFrameIntervalX e ID3D12Device::ScheduleFrameEventX antes de prosseguir para aguardar a próxima origem de quadro. O aplicativo deve presumir um pipeline de quadros vazio após ser retomado.Pode ser comum que um aplicativo receba um evento de suspensão enquanto aguarda que uma origem de quadro (ou outro evento de quadro) seja sinalizada durante uma chamada para ID3D12Device::WaitFrameEventX. Se o thread do aplicativo responsável por chamar SuspendX na fila de comandos gráficos for diferente daquele usado para aguardar eventos de quadro, a chamada ID3D12Device::WaitFrameEventX (embora iniciada antes da chamada SuspendX) poderá falhar com D3DERR_DEVICEREMOVED.
