谈一谈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外接纹理的主要内容,如果未能解决你的问题,请参考以下文章

万万没想到——flutter这样外接纹理

万万没想到-Flutter这样外接纹理

谈一谈对Activity的理解

谈一谈对Activity的理解

谈一谈|搭建TS代码编译器环境

谈一谈vuex