Flutter图片内存占用过大问题

  图片(Image)加载原理:

        Image 

        显示图⽚的Widget,通过ImageState管理ImageProvider的⽣命周期。

        ImageProvider:

        图⽚的抽象概念。 根据Image创建实例时调用的工厂方法的不同(Image.network或者Image.assetImage,使用ImageProvider的不同子类,如NetworkImage、AssetImage分别通过网络或本地获取图⽚字节数据(load)并进行解码,创建  ImageStream⽤于监听结果。图片的key为url+scale,⽤于描述图⽚的唯⼀以及是否已有缓存。

        ImageStream:

        图片load的目标对象。通过 ImageStreamCompleter 最后会返回⼀个 ImageInfo,⽽ImageInfo 中的ui.Image是RenderObject的⽬标绘制对象。

        ImageCache:

        图⽚缓存单例PaintingBinding.instance.imageCache(默认100MB或1000张图满⾜其⼀,就标记最先缓存的对象给释放其引用)

图片加载优化策略:

  1. 通过PaintingBinding.instance.imageCache设置图片缓存最大大小, 未显示图片及时调用evict方法释放。
  2. 使用Image.network时, 设置缓存的图片的宽高(cacheWidth、cacheHeight
  3. 若要实现图片本地文件缓存,加尼亚使用第三方图片插件cached_network_image,在使用该组件时克设置图片磁盘缓存最大宽高(maxWidthDiskCache, maxHeightDiskCache), 以避免缓存过大的图片原图,造成不必要的内存及磁盘消耗。
  4. Flutter内存占用较大,还可能是因为另外一种原因:Native侧和Flutter侧都使用大量相同的图片,图片在两种环境中均被加载到内存。解决这一问题的方案是外接纹理。即图片在Native侧加载注册一个FlutterTexture对象,然后生成一个纹理id,Flutter侧通过Texture(id)根据纹理id对进行访问。

相关推荐

  1. linux缓冲区(buff/cache)内存占用高解决办法

    2024-03-11 06:30:02       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 06:30:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 06:30:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 06:30:02       82 阅读
  4. Python语言-面向对象

    2024-03-11 06:30:02       91 阅读

热门阅读

  1. MybatisPlus自动生成代码

    2024-03-11 06:30:02       42 阅读
  2. Git Cherry-Pick命令详解:轻松选取与移植提交

    2024-03-11 06:30:02       41 阅读
  3. Android Intent 传递数据过大问题

    2024-03-11 06:30:02       45 阅读
  4. [论文笔记] Transformer-XL

    2024-03-11 06:30:02       39 阅读
  5. HTTP常见报错响应码

    2024-03-11 06:30:02       43 阅读
  6. 【设计模式专题之工厂方法模式】2.积木工厂

    2024-03-11 06:30:02       42 阅读
  7. Asp .Net Core 集成 Newtonsoft.Json

    2024-03-11 06:30:02       49 阅读
  8. 二叉树遍历详解

    2024-03-11 06:30:02       35 阅读