android低配cpu,在Android上使用CPU到GPU的最低开销相机

我的应用程序需要在cpu上对实时相机帧进行一些处理,然后再在GPU上进行渲染.还有一些其他的东西在GPU上呈现,这取决于cpu处理的结果;因此,保持所有内容同步非常重要,这样我们就不会在GPU上渲染帧本身,直到该帧的cpu处理结果也可用.

问题是在Android上这个最低的开销方法是什么?

在我的情况下cpu处理只需要一个灰度图像,因此Y平面打包的YUV格式是理想的(并且往往与相机设备的原生格式很好地匹配). NV12,NV21或全平面YUV都可以提供理想的低开销灰度访问,因此在cpu方面是首选.

在原始相机API中,setPreviewCallbackWithBuffer()是将数据输入cpu进行处理的唯一合理方法.这使得Y平面分离,因此非常适合cpu处理.将此框架提供给OpenGL以便以低开销方式呈现是更具挑战性的方面.最后,我编写了一个NEON颜色转换例程来输出RGB565,并且只需使用glTexSubImage2d就可以在GPU上使用它.这是在Nexus 1时间帧中首次实现的,即使是320×240 glTexSubImage2d调用也需要50ms的cpu时间(我猜想,尝试进行纹理调配的不良驱动程序 – 后来在系统更新中显着改善).

回到那一天,我研究了像eglImage扩展这样的东西,但它们似乎不适用于用户应用程序,也没有足够的文档记录.我对内部android GraphicsBuffer类进行了一些研究,但理想情况下希望保留在受支持的公共API的世界中.

android.hardware.camera2 API承诺能够将ImageReader和SurfaceTexture连接到捕获会话.不幸的是我无法看到任何确保正确的顺序管道的方法 – 在cpu处理完毕之前暂停调用updateTexImage()很容易,但如果在处理过程中另一帧已经到达,那么updateTexImage()将直接跳到最新帧.在多个输出中似乎也会有每个队列中帧的独立副本,理想情况下我想避免这些副本.

理想情况下,这就是我想要的:

>相机驱动程序使用最新帧填充一些内存

> cpu获取指向内存中数据的指针,可以读取Y数据而无需复制

>当帧准备就绪时,cpu处理数据并在我的代码中设置一个标志

>开始渲染帧时,检查新帧是否准备就绪

>调用一些API来绑定与GL纹理相同的内存

>准备好较新的帧时,将保留前一帧的缓冲区释放回池中

我无法看到在Android上使用公共API完全实现零拷贝样式的方法,但是最接近它的是什么?

我试过的一个疯狂的事情似乎有用,但没有记录:ANativeWindow NDK API可以接受数据NV12格式,即使适当的格式常量不是公共标题中的那个.这允许通过memcpy()填充SurfaceTxture的NV12数据,以避免cpu端颜色转换以及glTexImage2d中驱动程序端发生的任何混乱.这仍然是数据的额外副本,虽然感觉它应该是不必要的,并且再次因为它没有文档可能不适用于所有设备.支持的顺序零拷贝相机 – > ImageReader – > SurfaceTexture或同等产品将是完美的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值