Skip to main content

ImageCache 大型圖片

停止自動增加 ImageCache 的 maxByteSize 以容納大型圖片。

摘要

#

ImageCachemaxByteSize 現在不會再自動變大來容納大型圖片。

背景說明

#

過去,當將圖片載入 ImageCache,且該圖片的位元組大小超過 ImageCachemaxByteSize 時, Flutter 會永久增加 maxByteSize 的數值以容納這些圖片。 這樣的邏輯有時會導致 maxByteSize 數值膨脹,讓在記憶體有限的系統上運作變得更加困難。

變更說明

#

以下「變更前」與「變更後」的偽程式碼,展示了對 ImageCache 演算法所做的調整:

dart
// Old logic pseudocode
void onLoadImage(Image image) {
  if (image.byteSize > _cache.maxByteSize) {
    _cache.maxByteSize = image.byteSize + 1000;
  }
  _cache.add(image);
  while (_cache.count > _cache.maxCount
      || _cache.byteSize > _cache.maxByteSize) {
    _cache.discardOldestImage();
  }
}
dart
// New logic pseudocode
void onLoadImage(Image image) {
  if (image.byteSize < _cache.maxByteSize) {
    _cache.add(image);
    while (_cache.count > _cache.maxCount
        || _cache.byteSize > cache.maxByteSize) {
      cache.discardOldestImage();
    }
  }
}

遷移指南

#

在某些情況下,ImageCache 可能會因為新的邏輯而發生 thrashing(頻繁清除與重建快取),而這在先前版本中並未出現,特別是當你載入的圖片大於你的 cache.maxByteSize 值時。 你可以透過以下其中一種方式來解決這個問題:

  1. 提高 ImageCache.maxByteSize 值,以容納更大的圖片。
  2. 調整你的圖片載入邏輯,確保圖片能夠適當地符合你所設定的 ImageCache.maxByteSize 值。
  3. 繼承(subclass)ImageCache,實作你想要的邏輯,並建立一個新的綁定(binding)來提供你自訂的 ImageCache 子類別(詳見 image_cache.dart 原始碼)。

時程

#

舊的演算法已不再支援。

合併於版本:1.16.3
穩定版釋出:1.17

參考資料

#

API 文件:

相關議題:

相關 PR:

其他: