以直接呈現與畫面排程取代交換鏈結
Game OS 已全面改造圖形呈現的程序。其目標如下。- 對可顯示資源的建立與管理提供更直接的控制
- 縮短從輸入裝置取樣到呈現的畫面資源掃描輸出的端對端延遲
- 擴充動態設定顯示平面與參數的彈性
- 提高選擇用於提交呈現的命令佇列的自由度
- 建立明確的 CPU 節流機制,以精細控制模擬與轉譯管線的執行
- 強化畫面管線統計資料的維護與報告
- 直接呈現可顯示的 ID3D12Resource 物件,讓交換資源的排列與選擇更具彈性,因為鏈結演變為使用者管理的集區。
- 能夠在任何圖形或運算命令佇列上呈現,可消除圖形佇列在處理交換資源後等待由運算佇列發出訊號之呈現柵欄而造成的停滯 (近期將提供支援)。
- 引進以管線權杖形式正式識別畫面的方法。畫面管線權杖提供一種方式,可針對管線持續時間跨越多個垂直同步間隔的畫面,將畫面節流、輸入取樣、CPU 命令清單錄製事件、GPU 轉譯事件與顯示管線事件建立關聯。接著可依權杖查詢個別畫面的一致統計資料,並透過 PIX 呈現。讓系統了解畫面的生命週期 (包括其中發生的所有重要事件),對 XBOX Game Streaming 服務的監視與調整也更有幫助。
- 以事件為基礎、由中斷驅動的新顯示畫面產生排程,允許以呈現間隔的節奏指定畫面管線中的起始時間,並在錯過畫面時自動進行相位調整。排程允許選擇性指定使用者建立的事件,以擴充發出訊號的方式。
- 以輪詢或封鎖畫面管線起始事件作為正式節流機制的系統。此系統允許選擇性指定使用者建立的事件作為等待的額外條件。
- 以更抽象的方式表示轉譯與呈現頻率,呈現間隔以時間長度而非整數垂直空白間隔來指定。此變更可在顯示輸出速率不固定的情況下 (例如在 60 Hz 或 120 Hz 顯示器上以 60 Hz 轉譯),於固定的主機硬體上維持一致的畫面轉譯,並讓未來能直接支援高於 60 Hz 頻率的原生轉譯 (例如原生 120 Hz)。
- 擴充所追蹤的畫面統計資料,並提供可篩選、可延伸以因應未來新增項目的報告機制。
- 識別畫面起始時間,搭配未來新增的同步顯示與輸入裝置時鐘 (以避免持續漂移),讓平台能夠指示由遊戲台 (或其他) 裝置韌體收集輸入樣本,並及時提供給遊戲查詢,以協助將整體延遲降到最低。
從 Windows 與 ERA 移轉
Game OS 不支援的交換鏈結、呈現與排程相關 API 都有對應的替代項目。為協助您快速了解,下表提供一組常用的舊版 API 與參數,並在相鄰欄中列出其對應的替代項目。高階工作流程
建立可顯示資源集區、將畫面排程作為明確的節流機制,以及將畫面資源呈現到顯示器的一般方法,包含幾個初始化步驟,接著是遊戲迴圈中的一連串作業。如需每個步驟的詳細資訊 (詳細說明、影響與建議用法),請參閱參考頁面。 初始化- 呼叫 ID3D12Device::CreateCommittedResource,並在 HeapFlags 中包含 D3D12_HEAP_FLAG_ALLOW_DISPLAY,以建立一組 ID3D12Resource 物件,作為支援顯示呈現的可交換資源集區 (也就是「交換鏈結」)。
- 呼叫 ID3D12Device::SetFrameIntervalX 以建立畫面重新整理速率與週期。LengthInMicroseconds 定義畫面呈現到顯示器 (翻轉) 之間的時間間隔。PeriodInIntervals 以整數畫面間隔定義 CPU 允許領先 GPU 的程度。CPU 在受到節流之前,允許領先 GPU PeriodInIntervals - 1 個畫面 (例如,PeriodInIntervals 為 2 時,允許 CPU 在 GPU 處理為畫面 n 提交的命令時,錄製並提交畫面 n + 1 的轉譯命令)。
- 呼叫 ID3D12Device::ScheduleFrameEventX 以建立在畫面間隔內節流 CPU 的時間點。指定 D3D12XBOX_FRAME_EVENT_ORIGIN 的 Type 以及 IntervalOffsetInMicroseconds 時間位移,以排程畫面的起始事件。CPU 會受到節流,直到間隔內經過指定的 IntervalOffsetInMicroseconds 時間量為止。
- 以 D3D12XBOX_FRAME_EVENT_ORIGIN 的 Type 呼叫 ID3D12Device::WaitFrameEventX 以執行 CPU 節流。將 TimeOutInMs 指定為 D3D12XBOX_WAIT_FRAME_EVENT_INFINITE 以封鎖直到起始時間到達,或指定以毫秒為單位的固定逾時來輪詢起始事件 (如果起始時間尚未到達,會傳回 S_FALSE)。為 pToken 指定 D3D12XBOX_FRAME_PIPELINE_TOKEN 的指標,在起始時間到達而傳回時,會將其設定為唯一識別該畫面的權杖值。必須為該畫面追蹤此權杖,並在將其呈現到顯示器時提供。
- 查詢控制器輸入,並將畫面轉譯到以顯示支援建立的 ID3D12Resource 物件。
- 呼叫 ID3D12CommandQueue::PresentX,將轉譯完成的畫面資源排入佇列以呈現到顯示器。資源與畫面權杖會在 pPlaneParameters 陣列中提供。
- 使用預期最後一個已到達顯示器之畫面的權杖呼叫 ID3D12Device::GetFrameStatisticsX (或針對感興趣的不同畫面進行多次呼叫)。分析傳回的畫面統計資料,據以更新已建立的畫面節流點,目標是將從控制器輸入到顯示的延遲降到最低。以 D3D12XBOX_FRAME_EVENT_ORIGIN 類型呼叫 ID3D12Device::ScheduleFrameEventX 來執行更新,這些更新會在呼叫後下一個要呈現的畫面翻轉到顯示器時套用。
- 在繼續等待下一個畫面起始時間之前 (或在輪詢期間),於 CPU/GPU 上執行任何與輸入無關的工作。
