暫停與繼續事件
在 XBOX One 上,Game OS 應用程式可由程序生命週期管理 (PLM) 暫停與繼續。在暫停狀態下,應用程式的記憶體會保持不變,但應用程式沒有任何 CPU 或 GPU 資源。Game OS 應用程式實作暫停與繼續是 XBOX One 的 XBOX 需求 (XR) 之一。 如果應用程式收到 Suspending 事件,應用程式必須呼叫 SuspendX。否則,應用程式將會被終止。SuspendX 與 ResumeX 呼叫都必須在遊戲的轉譯執行緒上執行,以確保 SuspendX 呼叫能正確儲存 GPU 狀態。 遊戲暫停時,在 GPU 繼續之前無法轉譯任何內容。在 Direct3D SuspendX 與 ResumeX 呼叫之間呼叫任何 Direct3D API (例如呼叫 ID3D12GraphicsCommandList::DrawInstanced 或 ID3D12CommandQueue::ExecuteCommandLists 方法) 會擲回例外狀況。 以下是 XBOX One 上 Direct3D 的暫停與繼續方法。 這些方法應在圖形命令佇列上叫用,因為運算與複製佇列不支援這些方法。對畫面排程與統計資料的影響
暫停應用程式會對其已建立的畫面排程造成不確定性的中斷。由於暫停事件發生的時間無法預測,系統無法在後續的繼續事件之後安全地還原已建立的排程及其時間狀態。為了提供穩健且可預測的行為,系統會在處理 SuspendX 呼叫期間清除應用程式的畫面排程。呈現佇列會排清到顯示器,而任何由 WaitFrameEventX 開始但尚未透過 PresentX 傳送到顯示器的畫面都會被捨棄。 因此,從 ResumeX 呼叫傳回後,應用程式必須先透過呼叫 ID3D12Device::SetFrameIntervalX 與 ID3D12Device::ScheduleFrameEventX 重新建立所需的畫面排程,才能繼續等待下一個畫面起始時間。應用程式在繼續之後應假設畫面管線是空的。應用程式在呼叫 ID3D12Device::WaitFrameEventX 期間等待畫面起始時間 (或其他畫面事件) 發出訊號時收到暫停事件,可能是很常見的情況。如果負責在圖形命令佇列上呼叫 SuspendX 的應用程式執行緒與用來等待畫面事件的執行緒不同,則 ID3D12Device::WaitFrameEventX 呼叫 (即使在 SuspendX 呼叫之前就已開始) 可能會失敗並傳回 D3DERR_DEVICEREMOVED。
