谈一谈Flutter外接纹理
Posted 远程Talk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谈一谈Flutter外接纹理相关的知识,希望对你有一定的参考价值。
导言:这篇文章主要介绍在android上SurfaceTexture的应用 - Flutter外接纹理,并给出了外接纹理的正确姿势,而阿里闲鱼的技术方案则是错误的姿势。
1 背景知识
2 实现原理
2.1 性能
2.2 应用
3 闲鱼技术方案
4 具体实现
4.1 流程图
4.2 关键代码
4.3 效果示意图
5 结语
1 背景知识
当我们用flutter做实时视频渲染时,往往是要对视频或者相机画面做滤镜处理的,如图:
如果我们要用flutter定义的消息通道机制来实现这个功能,就需要将摄像头采集的每一帧图片都要从原生传递到flutter中,这样做代价将会非常大,因为将图像或视频数据通过消息通道实时传输必然会引起内存和CPU的巨大消耗。为此,flutter提供了两种机制实现这一功能:
-
PlatformView -
Texture Widget
PlatformView
实质上是将原有的NativeView嵌入到Flutter中显示,虽然使用和移植很简单,但并不是性能最优的做法。
而Texture Widget
是flutter提供的另一种机制,可以将native纹理共享给flutter进行渲染。但由于native纹理与flutter是两个OpenGL Context,如果直接使用的话,需要经过GPU -> CPU -> GPU的转换开销,这对于实时视频渲染是很难令人接受的。
所以解决方案就是共享纹理。
2 实现原理
在上篇文章中,我们可以知道共享纹理有两种实现:
-
ShareContext -
共享内存
这两种方式均能实现共享纹理。
这里假设要共享纹理的是两个OpenGL环境A与B,A是自己的OpenGL环境,B是第三方的OpenGL环境。
当然A与B都是自己的OpenGL框架也可以。不过在实际开发中,B往往是第三方的OpenGL框架,不然干嘛要用共享纹理呢,直接在一个环境中开发就行了
以上是关于谈一谈Flutter外接纹理的主要内容,如果未能解决你的问题,请参考以下文章