flutter 获取定位_实时渲染不是梦:通过共享内存优化Flutter外接纹理的渲染性能...

本文介绍了如何通过共享内存优化Flutter外接纹理的渲染性能,避免了GPU-CPU-GPU的数据转换带来的性能损失。详细探讨了Flutter外接纹理的原理,CVPixelBuffer的内存管理,以及提出了一种共享内存的解决方案,通过实验证明了这种方法的可行性。
摘要由CSDN通过智能技术生成

6f249f152d8c412902d709add6669f65.png

前言

之前看了一篇闲鱼的文章《万万没想到——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 外接纹理的原理

先回顾下前置知识,看看官方提供的外接纹理机制究竟是怎样运行的。

cc1f6328546436cfcfa0db486cdd5170.png

图中红色块,是我们自己要编写的native代码,黄色是Flutter engine的内部代码逻辑。整体流程分为注册纹理,和整体的纹理渲染逻辑。

注册纹理

  1. 创建一个对象,实现FlutterTexture协议,该对象用来管理具体的纹理数据

  2. 通过FlutterTextureRegistry来注册第一步的FlutterTexture对象,获取一个Flutter纹理id

  3. 将该id通过channel机制传递给dart侧,dart侧就能够通过Texture这个widget来使用纹理了,参数就是id

纹理渲染

  1. dart侧声明一个Te

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值