如果您在製作圖片時不夠用,使用圖片可能會快速導致效能問題
請務必謹慎。您在工作時很容易遇到 OutOfMemoryError
載入大型點陣圖請按照下列最佳做法,確保應用程式可在
我們會盡力而為
僅載入需要的點陣圖大小
多數智慧型手機都配備會產生大型圖片檔的高解析度相機。如果 提高圖像的解析度時, 圖片,或者只載入圖片容器大小範圍內的圖片。 持續載入大於所需的圖片,可能會耗盡 GPU 快取,導致 效能較差的 UI 算繪結果
如何管理圖片大小:
- 在不影響使用者的情況下,盡可能縮小圖片檔案的大小 輸出圖片)。
- 考慮將圖片轉換為 WEBP 格式,而非 JPEG 或 PNG。
- 針對不同的螢幕解析度提供較小的圖片 (請參閱提示 #3)。
- 使用圖片載入程式庫,將圖片縮小以符合 。這有助於改善 螢幕畫面。
盡可能使用向量而非點陣圖
在畫面上以視覺化方式呈現事物時,您必須決定 以向量表示向量圖片較使用點陣圖,因為這類圖片 避免在縮放時以不同大小呈現象素不過,並非所有情況 能以向量表示,使用相機拍攝的圖片無法轉換 轉換為向量
為不同螢幕大小提供額外資源
如果應用程式提供內建圖片,建議您提供不同尺寸的圖片 針對不同裝置解析度提供不同的素材資源藉此縮減下載內容大小 以及提升效能,因為應用程式載入會降低 並用於解析度較低的裝置上。如要進一步瞭解如何 請參閱適用於不同裝置大小的替代點陣圖 點陣圖說明文件
使用 ImageBitmap
時,請先呼叫 prepareToDraw
再繪圖
使用 ImageBitmap
時,開始將紋理上傳至
GPU,請先呼叫 ImageBitmap#prepareToDraw()
,然後再實際繪製。這個
可協助 GPU 準備紋理,並提高
在螢幕上的影像多數圖片載入程式庫都已執行這項最佳化作業,但
如果您是自行處理 ImageBitmap
類別,
並以此收費
最好將 Int
DrawableRes
或網址做為參數傳遞至可組合項,而非 Painter
由於處理圖片的程序相當複雜 (例如編寫等號
Bitmaps
函式的運算成本較高),Painter
API 則是
未明確標示為 Stable 類別。不穩定的類別
會導致不必要的重組作業,因為編譯器無法輕易推斷
但資料已經變得不同
因此,最好傳遞網址或可繪製資源 ID 做為參數。
可組合項,而非將 Painter
做為參數傳遞。
// Prefer this:
@Composable
fun MyImage(url: String) {
}
// Over this:
@Composable
fun MyImage(painter: Painter) {
}
不要在記憶體中保存不再需要的點陣圖
載入記憶體的點陣圖越多,您可以執行
避免裝置記憶體不足例如,載入大型的 Image 清單時
畫面上的可組合項,請使用 LazyColumn
或 LazyRow
確保記憶體
會在捲動大型清單時釋放。
不要使用 AAB/APK 檔案封裝大型圖片
造成應用程式下載大小偏大的主要原因之一,就是 封裝在 AAB 或 APK 檔案中使用 APK 分析工具確保 確認包裝沒有大於所需的圖片檔請縮減尺寸,或 建議你將圖片放在伺服器上,並且只在必要時下載圖片。
為您推薦
- 注意:系統會在 JavaScript 關閉時顯示連結文字
- ImageBitmap 與 ImageVector {:#bitmap-vs-vector}
- 在 Compose 中儲存 UI 狀態
- Jetpack Compose 階段