背景
我们闲鱼使用的图片方案是自研的外接纹理方案:
Android侧创建SurfaceTexture,通过FlutterJNI注册到Flutter engine里,最后返回texture id给Flutter应用层,应用层使用Texture Widget和textue id去显示图片纹理。
纹理数据则是在Android侧,通过OpenGL将图片纹理写入到SurfaceTexture,然后通过Flutter engine里的共享内存,将纹理数据传入到应用层,最终交给Skia渲染。
![da3590f937b7354f8c99f83c82676934.png](https://img-blog.csdnimg.cn/img_convert/da3590f937b7354f8c99f83c82676934.png)
这里面存在的问题:Flutter应用层的纹理数据没有缓存,每次都需要重新将Bitmap数据渲染成纹理,再交给Flutter应用层使用。Native图片加载会内存缓存,Flutter自身提供的图片库也存在缓存,这2个缓存相互隔离,占用很大的内存空间。而且Flutter图片缓存基本都是存放的本地资源图,而我们Flutter页面上大部分其实都是网络下载的外接纹理图片,导致缓存资源利用率很低。
分析
针对上述的3个问题,我们先抛开技术实现,假设下要解决这3个问题,最理想的一个解决方案是什么:
纹理没有缓存,那我们在应用层增加一个纹理的内存缓存就解决了。
当上层的应用层已经缓存纹理,那Native侧的Bit