背景
我們閒魚使用的圖片方案是自研的外接紋理方案:
- Android側創建SurfaceTexture,通過FlutterJNI註冊到Flutter engine裏,最後返回texture id給Flutter應用層,應用層使用Texture Widget和textue id去顯示圖片紋理。
- 紋理數據則是在Android側,通過OpenGL將圖片紋理寫入到SurfaceTexture,然後通過Flutter engine裏的共享內存,將紋理數據傳入到應用層,最終交給Skia渲染。
這裏面存在的問題: Flutter應用層的紋理數據沒有緩存,每次都需要重新將Bitmap數據渲染成紋理,再交給Flutter應用層使用。Native圖片加載會內存緩存,Flutter自身提供的圖片庫也存在緩存,這2個緩存相互隔離,佔用很大的內存空間。而且Flutter圖片緩存基本都是存放的本地資源圖,而我們Flutter頁面上大部分其實都是網絡下載的外接紋理圖片,導致緩存資源利用率很低。
分析
針對上述的3個問題,我們先拋開技術實現,假設下要解決這3個問題,最理想的一個解決方案是什麼:
- 紋理沒有緩存,那我們在應用層增加一個紋理的內存緩存就解決了。
- 當上層的應用層已經緩存紋理,那Native側的Bitmap的內存緩存也可以被去掉,只保留圖片資源的磁盤緩存。
- 整個App的內存緩存,只有紋理緩存,Flutter的ImageCache緩存,爲了避免內存資源的浪費,將這2個緩存合成一個
原文鏈接:【https://www.infoq.cn/article/4t9HrwJFvRh41X2328Gy】。未經作者許可,禁止轉載。