跳至主要内容

ImageCache 大图像

摘要

#

ImageCachemaxByteSize 不会再自动增大以适应大型图像。

上下文

#

以前,当将字节大小大于 ImageCachemaxByteSize 的图像加载到 ImageCache 中时,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 在新的逻辑下可能会出现抖动,而在之前则不会,特别是如果您加载的图像大于 cache.maxByteSize 值时。这可以通过以下方法之一解决

  1. 增加 ImageCache.maxByteSize 值以适应更大的图像。
  2. 调整您的图像加载逻辑,以确保图像完美地适合您选择的 ImageCache.maxByteSize 值。
  3. 子类化 ImageCache,实现您所需的逻辑,并创建一个提供您 ImageCache 子类的新的绑定(请参阅image_cache.dart 源代码)。

时间线

#

旧算法不再受支持。

包含于版本:1.16.3
稳定版发布:1.17

参考文献

#

API 文档

相关问题

相关 PR

其他