前言
之前看了一篇闲鱼的文章《万万没想到——Flutter这样外接纹理》,了解到Flutter提供一种机制,可以将native的纹理共享给Flutter来进行渲染。但是,由于Flutter获取native纹理的数据类型是CVPixelBuffer
,导致native纹理需要经过GPU->CPU->GPU的转换过程消耗额外性能,这对于需要实时渲染的音视频类需求,是不可接受的。
闲鱼这边的解决方案是修改了Flutter engine的代码,将Flutter的gl环境和native的gl环境通过ShareGroup来联通,避免2个环境的纹理传递还要去cpu内存绕一圈。此方案能够解决内存拷贝的性能问题,但暴露Flutter的gl环境,毕竟是一个存在风险的操作,给以后的Flutter渲染问题定位也增加了复杂度。
所以,有没有一个完美、简便的方案呢?
答案就是利用CVPixelBuffer
的共享内存机制。
Flutter 外接纹理的原理
先回顾下前置知识,看看官方提供的外接纹理机制究竟是怎样运行的。
图中红色块,是我们自己要编写的native代码,黄色是Flutter engine的内部代码逻辑。整体流程分为注册纹理,和整体的纹理渲染逻辑。
注册纹理
创建一个对象,实现
FlutterTexture
协议,该对象用来管理具体的纹理数据通过
FlutterTextureRegistry
来注册第一步的FlutterTexture
对象,获取一个Flutter纹理id将该id通过channel机制传递给dart侧,dart侧就能够通过
Texture
这个widget来使用纹理了,参数就是id
纹理渲染
dart侧声明一个
Te