我正在使用MediaCodec播放1080 p@60 play视频。这是在飞思卡尔SabreSD平台上的AndroidLollipo5.1。
最初,由于BufferQueue同步模式,FPS远远低于60。我现在可以通过将BufferQueue更改为异步的方式(在JB中)来实现70 FPS的播放。
现在我面临的下一个挑战是视频延迟,当我开始与屏幕交互时,FPS急剧下降到40 (拉下通知条,按音量按钮等)。
因此,我运行rafika MultiSurfaceActivity和唱片GL,我可以看到所有的测试播放顺利时,没有任何屏幕被触摸或干扰,但一旦我开始滚动通知栏从顶部,并继续很长时间,fps会减少到35-40 fps。
我已经在Kitkat 4.4.2和JB4.2.2上确认了同样的测试,它们似乎运行良好。
同样的行为时,玩MP4从画廊。当我们开始玩Notification时,视频被卡住了,并且延迟了很多。
有谁能解释一下从Kitkat到Lollipop导致这个问题的原因(VSync,?)
发布于 2016-04-17 18:34:59
从Grafika问题跟踪器中退一步
弹跳球是软件渲染的,所以任何占用CPU时间的东西都会使它慢下来。在中档CPU和大型显示器(如Nexus 10)的设备上,它永远不会接近60 CPUs。所以当你在玩导航条的时候,减速并不让我惊讶,但是如果你停止玩导航条的时候,它仍然很慢,那就有点奇怪了。
视频播放应该受到较少的影响,因为这对CPU的影响较小。
对这些问题的调查通常从使用系统捕获“好”和“坏”状态下的跟踪开始,并对这两种状态进行比较。
BufferQueue“异步模式”的关键点是,如果使用者跟不上生产者,则允许帧下降。它主要用于SurfaceTexture,生产者和消费者都在同一个应用程序中,可能在同一个线程上,所以让生产者等待消费者等待可能会导致程序挂起。我不知道你想要它超过60英尺是什么意思,但我猜你在屏幕上扔框的速度比它渲染的快.因此,您并没有真正提高帧速率,您只是使用BufferQueue来删除帧,而不是使用编舞来决定何时需要自己删除它们。
无论如何,我早在2014年6月就离开了谷歌,早在棒棒糖完成之前。如果某些东西在KitKat上正确工作,但在棒棒糖上却很奇怪,我恐怕不能提供太多的洞察力。如果您可以轻松地再现该行为,可能值得捕获一个演示问题的视频(将第二个智能手机指向显示该问题的设备,以便他们可以看到您如何操作该设备)并在http://b.android.com/上注册一个bug。
“任择议定书”上传的一些痕迹:
看着kitkat的踪迹,SurfaceFlinger发生了一些奇怪的事情。主线程在postFrameBuffer中停留了很长一段时间(23-32ms)。它最终苏醒过来,CPU行表示它在等待来自"galcore守护进程“的活动,我对此并不熟悉(对于Vivante GPU来说似乎是特别的)。
棒棒糖跟踪只显示CPU行,好像捕获是在没有必要标记的情况下完成的。我不认为systrace捕获命令在kitkat和棒棒糖之间发生了很大的变化,所以我对为什么用户空间启动的日志记录会消失而内核线程调度仍然存在感到困惑。确保指定了sched gfx view。
较新的棒棒糖痕迹只有大约一秒钟的好数据。当您看到“没有完成”,这意味着“开始”记录没有匹配的“结束”记录。可以使用-b标志增加systrace日志缓冲区大小。不过,我觉得够了。
查看/system/bin/surfaceflinger行,您可以看到,在“好”跟踪中,postFrameBuffer通常在大约16‘s内完成,但它仍然在等待galcore。放大388 in (使用WASD键)。在388.196ms的CPU 2行中,您可以看到galcore做了一些事情。就在它完成后,表面漂流行顶部的细线从浅灰色(睡眠)变为绿色(运行)。在388.548ms,同样在CPU 2上,galcore再次运行,然后您看到queueBuffer开始执行。
“坏”痕迹看上去是一样的。例如,您可以看到在101.146ms和101.666ms处执行了两次半核执行,对表面飞行器行的影响似乎是相似的。关键的区别在于在postFrameBuffer上花费的时间,大约是16毫秒左右的“好”和大约30毫秒的“坏”。
因此,这似乎并不是一种行为上的转变;相反,事情需要更长的时间,最后期限正在被错过。
据我所知,SurfaceFlinger正被galcore守护进程所耽搁。无论是“好”还是“坏”都是如此。要查看时间应该是什么样子,您可以在Nexus设备上运行systrace,或者将其与其他设备(例如本案例研究或这个问题中的跟踪)进行比较。如果放大,您可以看到doComposition在几毫秒内执行,postFrameBuffer在几毫秒内完成。
总结:你没有好和坏,你有坏和坏。-)我不知道什么是半核心,但你可能需要与GPU OEM对话。
https://stackoverflow.com/questions/36654216
复制相似问题