纹理Texture
纹理Texture可以理解为GPU内代表图像数据的一个对象
背景
问:在Flutter与原生的混合开发中,资源在Native和Flutter重复加载,导致内存占了双份的性能问题怎么解决?
答:用Texture外接纹理的方式缓解内存压力。
二、外接纹理
三、共享纹理
ShareGroup
是OpenGL ES中的一个概念,用于在不同的EAGLContext
之间共享纹理和其他资源。即在Flutter和iOS之间实现纹理共享,可以通过使用ShareGroup
来实现。(在iOS开发中,ShareGroup
对应于EAGLSharegroup
,而在Flutter中,可以通过Texture
控件来使用共享的纹理 。)
使用ShareGroup
实现Flutter和iOS原生纹理共享的基本步骤:
1 | // 1、创建一个 EAGLContext 并设置其 sharegroup,这个 sharegroup 将被用于后续创建共享纹理。 |
1 | // 在 Flutter 中使用 |
- 配置Flutter的
Texture
控件:在Flutter代码中,创建一个Texture
控件,并通过PlatformView
注册一个视图工厂,该工厂将返回一个实现了FlutterTexture
协议的对象。这个对象负责管理原生纹理,并实现copyPixelBuffer
方法来提供纹理数据给
以下内容摘自:谈一谈Flutter外接纹理
1 背景知识
当我们用flutter做实时视频渲染时,往往是要对视频或者相机画面做滤镜处理的,如图:
如果我们要用flutter定义的消息通道机制来实现这个功能,就需要将摄像头采集的每一帧图片都要从原生传递到flutter中,这样做代价将会非常大,因为将图像或视频数据通过消息通道实时传输必然会引起内存和CPU的巨大消耗。为此,flutter提供了两种机制实现这一功能:
- PlatformView
- Texture Widget
PlatformView
实质上是将原有的NativeView嵌入到Flutter中显示,虽然使用和移植很简单,但并不是性能最优的做法。而
Texture Widget
是flutter提供的另一种机制,可以将native纹理共享给flutter进行渲染。但由于native纹理与flutter是两个OpenGL Context,如果直接使用的话,需要经过GPU -> CPU -> GPU的转换开销,这对于实时视频渲染是很难令人接受的。所以解决方案就是共享纹理。