影格放送速度

Android Frame Pacing 程式庫 (又稱為 Swappy) 是 Android Game SDK 的一部分。這個程式庫可讓 OpenGLVulkan 遊戲的算繪順暢度 並修正 Android 裝置的影格使用速度

影格同步是指遊戲的邏輯和算繪迴圈 OS 的螢幕子系統和底層顯示硬體。Android 螢幕 子系統的設計,可避免特定視覺失真,例如撕裂。 螢幕子系統可按照下列步驟避免出現撕裂情形:

  • 在內部為已通過的影格預留緩衝區
  • 偵測延遲提交的影格
  • 在偵測到延遲影格時繼續顯示目前的影格

影格顯示時間不一致,是因為遊戲的算繪迴圈在 與原生顯示硬體支援的速率不同發生問題 當遊戲的轉譯迴圈對基礎顯示硬體而言過慢執行時 導致顯示時間不一致舉例來說,如果遊戲在 嘗試在原生支援 60 fps 的裝置上顯示 30 fps。 這是因為應用程式的顯示迴圈導致畫面上持續顯示重複影格, 額外 16 毫秒這類中斷情形會造成影格時間嚴重不一致 例如 33 毫秒、16 毫秒、49 毫秒等過於複雜的場景讓畫面更化 導致出現影格遺漏情形

Frame Pacing 程式庫會執行以下工作:

  • 彌補因遊戲影格時間較短而發生延遲的情形。
  • 針對較長的影格使用同步圍欄,以免播放延遲和延遲。
    • 插入應用程式等待的片段。這些物件可讓顯示管道擷取 而不是讓背壓加大
    • 使用同步圍欄 (EGL_KHR_fence_syncVkFence)。
  • 選擇重新整理頻率,以提供靈活度和流暢的簡報。 如果您的裝置支援多種刷新率
  • 使用 框架 提供用於偵錯和剖析的統計資料 統計資料

瞭解如何將程式庫設定為根據 請參閱支援的操作模式

如要使用 OpenGL 轉譯器或 Vulkan 轉譯器實作,請參閱

詳情請參閱「達到適當的影格使用速度」。

每秒影格數,節流介入措施

每秒影格數 (FPS) 節流介入措施,可讓遊戲以適當的每秒影格數運作 只使用平台端 且開發人員無須採取任何行動部分。

FPS 節流介入措施的實作會採用下列元件:

GameManagerService

GameManagerService 元件會為每位使用者維護 提供遊戲模式和遊戲介入措施的每款遊戲資訊。FPS 資訊會儲存在 GameManagerService 與其他介入資訊,例如解析度縮減因子 在每個使用者設定檔的 <PACKAGE_NAME, Interventions> 對應中。 當遊戲模式變更或介入措施更新時,系統就會存取 FPS 資訊。A 罩杯 每個PACKAGE_NAME和使用者的UID均不重複,可進一步翻譯 轉換為 <UID, Frame Rate> 配對,並傳送至 SurfaceFlinger。

SurfaceFlinger

SurfaceFlinger 元件已支援 只要畫面更新率是螢幕刷新率的除數,就能調節應用程式的每秒影格數。 如果是 vsync 事件,SurfaceFlinger 會檢查 vsync 是否有效性 應用程式,方法是確認 vsync 時間戳記是否處於階段,且會 應用程式。如果影格速率未以 vsync 分階段,SurfaceFlinger 會保留 直到影格速率和 Vsync 階段進入階段。

下圖說明 GameManagerService 與 SurfaceFlinger 的互動方式:

GameManagerService 與 SurfaceFlinger 之間的互動

圖 1. GameServiceManager 與 SurfaceFlinger 之間的互動

SurfaceFinger 會維護 <UID, Frame Rate> 組合對應,以設定新的 影格速率節流優先順序UID 是使用者和遊戲唯一的值,因此 在同一款遊戲中,使用者可以使用不同的畫面更新率設定。若要節流 遊戲的畫面更新率時,GameServiceManager 會呼叫 SurfaceFlinger 來覆寫遊戲的影格速率 UID運用這項機制,SurfaceFlinger 會在每次更新時更新對應 變更遊戲模式或乾預措施更新。SurfaceFlinger 會處理每秒影格數變化 相應地鎖住緩衝區

如要進一步瞭解 FPS 節流,請參閱 FPS 節流簡介