影格放送速度

Android Frame Pacing 函式庫,也稱為 Swappy,是Android Game SDK的一部分。它可以幫助OpenGLVulkan遊戲在 Android 上實現流暢的渲染和正確的幀節奏。

幀節奏是遊戲邏輯和渲染循環與作業系統顯示子系統和底層顯示硬體的同步。 Android 顯示子系統旨在避免某些視覺偽影,例如撕裂。顯示子系統透過執行以下操作來避免撕裂:

  • 在內部緩衝過去的幀
  • 檢測延遲的幀提交
  • 偵測到晚幀時繼續顯示目前幀

幀顯示時間不一致是由於遊戲渲染循環的運行速率與本機顯示硬體支援的速率不同而導致的。當遊戲的渲染循環對於底層顯示硬體來說運行太慢時,就會出現問題,導致顯示時間不一致。例如,當以 30 fps 運行的遊戲嘗試在本機支援 60 fps 的裝置上進行渲染時,遊戲的渲染循環會導致重複幀在螢幕上保留額外 16 毫秒。這種類型的斷開會造成幀時間的嚴重不一致,例如 33 毫秒、16 毫秒、49 毫秒等。過於複雜的場景會進一步加劇這個問題,因為它們會導致丟失幀的發生。

Frame Pacing 函式庫執行下列任務:

  • 補償由於短遊戲幀而導致的卡頓。
  • 對導致卡頓和延遲的長幀使用同步柵欄。
    • 將等待注入應用程式。這些可以讓顯示管道跟上,而不是讓背壓累積起來。
    • 使用同步柵欄( EGL_KHR_fence_syncVkFence )。
  • 如果您的裝置支援多種更新率,請選擇更新率以提供靈活性和流暢的演示。
  • 使用幀統計資訊提供調試和分析的統計資訊。

若要了解如何根據需要將庫配置為在不同模式下運行,請參閱支援的運行模式

若要使用 OpenGL 渲染器或 Vulkan 渲染器實現,請參閱

要了解更多信息,請參閱實現適當的幀節奏

每秒影格數限制干預

每秒幀數 (FPS) 節流幹預使遊戲能夠僅使用平台端的變更來以適當的 FPS 進行節奏,而不需要開發人員採取任何操作。

FPS節流幹預的實現使用以下組件:

遊戲管理服務

GameManagerService元件維護遊戲模式和遊戲幹預的所有每個使用者和每個遊戲資訊。 FPS 資訊與其他幹預資訊(例如解析度縮減因子)一起儲存在每個使用者設定檔的<PACKAGE_NAME, Interventions>映射中。當遊戲模式改變或乾預更新時,FPS資訊被存取。 UID對於每個PACKAGE_NAME和使用者來說都是唯一的,並且可以進一步轉換為<UID, Frame Rate>對發送到 SurfaceFlinger。

SurfaceFlinger

SurfaceFlinger元件已經支援限制應用程式的 FPS,只要幀速率是顯示更新率的除數即可。如果發生垂直同步,SurfaceFlinger 透過驗證垂直同步時間戳記是否與應用程式的幀速率同相來檢查受限應用程式的垂直同步的有效性。如果幀速率與 vsync 不同相,則 SurfaceFlinger 會保留該幀,直到幀速率與 vsync 同相。

下圖描述了GameManagerService和SurfaceFlinger之間的交互作用:

GameManagerService 和 SurfaceFlinger 之間的交互

圖 1. GameServiceManager 與 SurfaceFlinger 之間的交互

SurfaceFinger 維護<UID, Frame Rate>對映射來設定新的幀速率限制優先權。使用者和遊戲之間的UID是唯一的,因此單一裝置上的每個使用者在同一遊戲上可以有不同的幀速率設定。為了限制遊戲的幀速率,GameServiceManager 呼叫 SurfaceFlinger 來覆蓋 UID 的幀速率。透過這種機制,只要遊戲模式改變或介入更新,SurfaceFlinger 就會更新映射。 SurfaceFlinger 透過相應地鎖定緩衝區來處理 FPS 變化。

要了解有關 FPS 限制的更多信息,請參閱FPS 限制簡介