使用硬體加速功能改善錶面效能

使用標準檢視的 Wear OS 應用程式已因硬體加速圖像轉譯而有優勢。相反地,錶面通常使用畫布來實作,因此不會自動取得硬體加速功能。

為什麼要在錶面上使用硬體加速畫布?

在大多數情況下,使用硬體加速畫布時,錶面會以較高的畫面更新率轉譯。在較高的影格速率下,動畫和轉場效果會在眼中更順暢地呈現。對使用者來說,這些優勢是不言而喻的。

使用硬體加速畫布時,您也可以存取錶面的更多使用者介面效能資料。例如,只有在使用硬體加速畫布時,您只能存取評估使用者介面效能中所述的詳細影格資訊。

要求為錶面提供硬體加速功能

建立 CanvasRenderer 並設定 canvasTypeCanvasType.HARDWARE,用於要求錶面的硬體加速功能。

我的錶面是否使用硬體加速功能?

您可以透過開發人員選項或 ADB,檢查錶面目前是否使用硬體加速功能。

使用開發人員選項進行檢查

如要檢查錶面是否正在使用開發人員選項來使用硬體加速功能,請按照下列步驟操作:

  1. 在 Wear OS 裝置上,依序前往「設定」 >「開發人員選項」
  2. 啟用「針對 GPU 剖析功能進行偵錯」

    這個選項會在可見表面之上繪製重疊 (每個表面各一個),以顯示該介面各 GPU 轉譯階段所花費的時間。

  3. 在裝置上返回錶面。

  4. 如果錶面使用的是硬體加速畫布,每個錶面的轉譯後畫面都會顯示新的長條 (從右到左移動)。

使用 ADB 檢查

如要確認錶面是否使用 ADB 硬體加速功能,請按照下列步驟操作:

  1. 在 Wear OS 裝置上,將錶面變更為您要測試的錶面。
  2. 在互動模式中,讓錶面執行幾秒鐘。
  3. 執行下列 ADB 指令,檢查錶面是否使用硬體加速功能:

    adb shell dumpsys gfxinfo [package-name]

執行指令後,您會取得類似以下範例的輸出:

Applications Graphics Acceleration Info:
Uptime: 2239933 Realtime: 13568751

** Graphics info for pid 1100 [package-name] **

Stats since: 59875589194ns
Total frames rendered: 1213
Janky frames: 0 (0.00%)
50th percentile: 7ms
90th percentile: 18ms
95th percentile: 25ms
99th percentile: 150ms
Number Missed Vsync: 0
Number High input latency: 0
Number Slow UI thread: 0
Number Slow bitmap uploads: 0
Number Slow issue draw commands: 0
Number Frame deadline missed: 0

...

在這個輸出範例中,請注意以下顯示 Total frames rendered 這一行。 一般而言,如果在輸出中看到這個頁框資料,表示錶面使用的是加速畫布。否則 Total frames rendered 的數字 (以及報表中的其他畫面資料編號) 通常為零。

不過,由於 gfxinfo 是應用程式完整套件的輸出內容,因此除了硬體加速畫布以外,可能會看到一些影格時間資訊,例如應用程式使用作為設定畫面的 Activity。為了分辨差異,請確認錶面是唯一可見的介面,然後重新執行 adb shell dumpsys gfxinfo 指令來確認 Total frames rendered 的值是否增加。

最佳做法

請遵循下列最佳做法,確保使用者享有最佳體驗。

盡可能延長電池續航力

如果錶面有長時間執行的動畫,使用硬體加速功能可能會大幅降低裝置的電池續航力。如果錶面嘗試在所有頁框中繪圖,則問題可能更嚴重。為了避免對使用者造成負面影響,錶面不應長時間執行動畫。本指南並非使用硬體加速功能限定,但因為使用硬體加速功能會增加能繪製的影格數量,因此必須遵循加速原則。詳情請參閱「動畫的最佳做法」。

使用支援的繪圖操作

使用硬體加速時,不支援某些繪圖操作。如果您的小型程式碼路徑使用不支援的作業,您可以建立點陣圖支援的畫布,然後利用 canvas.drawBitmap() 將點陣圖繪製到錶面畫布上:

使用硬體加速功能時維持相容性

硬體加速功能適用於搭載 Android 9 (API 級別 28) 以上版本的 Wearuld OS 裝置。如要避免在舊裝置上執行特定繪圖作業 (不支援硬體加速),或執行硬體加速畫布不支援的繪圖作業,您可以勾選 Canvas.isHardwareAccelerated(),然後提供替代功能。