Android相机SurfaceTexture模式帧率下降问题

先抛结论:

SurfaceTexture的onFrameAvailable回调,受updateTexImage的影响。

再看查证过程:
首先问题:开发过程中发现,相机输出帧率随前处理帧率下降而下降,呈明显正相关,这里相机输出帧率是在onFrameAvailable回调里面统计的。所以搞不清到底是因为相机输出帧率变低了,导致前处理帧率变低;还是因为前处理太慢了,影响了相机输出?(通过minitrace统计前处理的耗时,确定是前处理每帧耗时太多)

怀疑的点:相机是不是有buffer限制,类似生产-消费,如果生产了(相机onFrameAvailable回调)没有消费(没有调用updateTexImage),是不是相机下一帧的回调会受影响?

追查:

1、首先看了下Android官方说明,SurfaceTexture确实有个构造方法,是可以指定是不是单个buffer模式,默认是false。看了我的app里面用的是默认的,官网没看到默认有多少个buffer。

public SurfaceTexture (boolean singleBufferMode)

官网Camera也没有相关的说明

public final void setPreviewTexture (SurfaceTexture surfaceTexture)

2、既然官网没有找到有用的说明,准备本地验证一下。

首先需要规避cpu占用的影响,我们让前处理的线程保持不变,还是会继续跑,到上屏。

所以相机输出的前几帧,还是正常跑。之后就进行分离:相机回调之后,用新的渲染线程去消费它,一回调就通知消费(注意,必须是渲染线程才能调用updateTexImage,否则会报错),而前处理线程(也是渲染线程)则使用之前从相机拿到的纹理,重复处理同一帧。

这里头涉及到SurfaceTexture要先在前处理线程 detachFromGLContext,再在新的渲染线程attachToGLContext。

验证结果:相机帧率果然不再下降,保持着一开始的帧率。(注意,相机帧率会受光照影响,所以过程中不要随意挪动手机)

补充一点发现:相机设置SurfaceTexture模式之后,相机帧回调只会通过SurfaceTexture的onFrameAvailable回调,不会再回调Camera.PreviewCallback的onPreviewFrame,即使设置了回调。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值