Android动画:跟上vsync

时间:2014-06-05 10:42:04

标签: android animation graphics vsync surfaceflinger

Bacground

我正在开发一个基于Android的应用程序,用于尚未定义的硬件平台(目前正在测试Ouya和MK802IV,所有Android 4.1+),其中包括向1080p @ 60HZ输出(大屏幕)显示各种内容。

该应用程序涉及显示滚动,这是一段通过屏幕从右向左滚动的文本(如电视新闻台上所示)。我确实有一个工作实现(扩展SurfaceView和手动绘图),可以60fps完美地工作。

问题

当应用程序的其余部分开始执行更高级的片段动画时,滚动的帧速率会下降。对我来说,这种下降是完全正常的(即使在优化之后),但是即使帧速率下降到30-40fps,我也希望滚动保持其原始速度和平滑度。这非常重要,因为用户可以看到移动文本平滑度。

我已经阅读了Android 4.1+中使用的Vsync和tipple缓冲,从我看到有两个可行的解决方案:

解决方案1:较慢的VSYNC

将整个应用程序或设备的Vsync全局降低到~30fps会很棒。不幸的是,eglSwapInterval不适用于任何经过测试的设备。

  • 有没有办法强制整个应用程序/设备以恒定的较低帧速率渲染?

解决方案2:知道我渲染的帧

由于设备具有Android 4.1+,我的SurfaceView被渲染为三重缓冲方案的一部分,现在如果我的实现以某种方式知道它渲染的帧,它可以相应地绘制滚动文本,尤其是子像素绘制不是问题。

我尝试过使用SystemClock.uptimeMillis的一个天真的实现,但是这样获得的时间戳波动太大(即使在60fps的时候,帧之间的差异也很不稳定)。

  • 有没有办法知道我渲染的帧或跳过了多少帧,所以我可以使用这些信息来正确渲染帧?

  • 关于如何处理文字滚动主题,您还有其他建议吗?

其他信息

请记住,文本可能很长(1000个字符+),显示在~20个字符/屏幕,〜4个像素/秒到1920x280px小部件,字体不是等宽字体。我曾想过使用OpenGL和GlSurfaceView,但是在这里问题保持不变,在高系统负载期间我仍然需要知道,我目前正在渲染什么。

平台依赖解决方案也非常受欢迎,因为我可以控制可能支持的平台(可能是一个非常狭窄而非主流的范围)。

提前感谢您的帮助。

0 个答案:

没有答案