问题背景
我们讨论过一个方案:
把图片缩略图的生成从 Flutter/Dart 侧搬到 Go 后端,由 Go 负责解密原图并生成小图。
在“远程服务端 + 多端客户端”的架构中,这个方案有明显优势:
- 服务器统一生成缩略图,多设备复用同一份缓存;
- 客户端只拉缩略图,减少拉原图再压缩的流量;
- 重计算集中在服务器,减轻移动端压力。
但在当前项目的现实前提下:
- Go 后端会通过 gomobile 打包进入客户端本地运行;
- 等于是把 Go runtime 和 HTTP server 内嵌进 app 里,而不是独立部署在远程主机。
性能角度的分析
在 gomobile 场景下:
- Flutter 与 Go 都跑在同一设备上,使用相同的 CPU、内存和电池;
- 只是“谁来做 decode + resize”:Dart +
image包 vs Go +imaging/bimg。
结合我们已经做的优化:
- 缩略图生成已经放到了 Flutter 的后台 Isolate;
- 滚动、上传/删除有 gate 控制;
- 加上本地磁盘缩略图缓存。
在这种基础上,再把缩略图生成搬到 Go:
- 对 UI 流畅度的提升非常有限:
- UI 是否卡主要看主线程有没有被重计算占用;
- 这一点 Isolate 已经解决。
- 对 CPU/发热/续航的改善也相对有限:
- 同一批图像,总要在本机 CPU 上解码和缩放;
- Go 的实现可能更高效一些,但一般是 10–20% 级别的差异,而不是数量级的提升。
架构与维护角度
把缩略图逻辑搬到 Go 主要带来的好处是:
- 在桌面/服务器/移动端之间复用一套核心逻辑;
- 所有“解密 + 生成缩略图”的代码集中在 Go 模块中,便于测试和维护;
- Flutter 仅负责调用和展示。
代价是:
- 引入 gomobile 集成和图像库的跨平台依赖;
- 增加包体积和基础内存占用;
- 调试链路更复杂。
决策结论
- 在当前阶段,不以“性能”为理由优先做这件事:
- Flutter 侧的优化已经解决主要卡顿问题;
- 把缩略图搬到 gomobile-Go 不会带来“非常明显”的性能提升。
- 把这件事定位为中长期架构演进选项:
- 当我们要把整个 Go 核心(解密、索引等)都 embed 进客户端时,再一并考虑统一缩略图逻辑;
- 那时收益更多来自“代码复用和架构统一”,而不是单点性能。
这也是一个典型的取舍案例:
在本地 gomobile 场景下,先把 Dart/Flutter 这一侧的工程化做到位,比过早追求“后端化”更划算。