我正在开发一个基于Android的应用程序,用于尚未定义的硬件平台(目前正在测试Ouya和MK802IV,所有Android 4.1+),其中包括向1080p @ 60HZ输出(大屏幕)显示各种内容。
该应用程序涉及显示滚动,这是一段通过屏幕从右向左滚动的文本(如电视新闻台上所示)。我确实有一个工作实现(扩展SurfaceView和手动绘图),可以60fps完美地工作。
当应用程序的其余部分开始执行更高级的片段动画时,滚动的帧速率会下降。对我来说,这种下降是完全正常的(即使在优化之后),但是即使帧速率下降到30-40fps,我也希望滚动保持其原始速度和平滑度。这非常重要,因为用户可以看到移动文本平滑度。
我已经阅读了Android 4.1+中使用的Vsync和tipple缓冲,从我看到有两个可行的解决方案:
将整个应用程序或设备的Vsync全局降低到~30fps会很棒。不幸的是,eglSwapInterval不适用于任何经过测试的设备。
由于设备具有Android 4.1+,我的SurfaceView被渲染为三重缓冲方案的一部分,现在如果我的实现以某种方式知道它渲染的帧,它可以相应地绘制滚动文本,尤其是子像素绘制不是问题。
我尝试过使用SystemClock.uptimeMillis的一个天真的实现,但是这样获得的时间戳波动太大(即使在60fps的时候,帧之间的差异也很不稳定)。
有没有办法知道我渲染的帧或跳过了多少帧,所以我可以使用这些信息来正确渲染帧?
关于如何处理文字滚动主题,您还有其他建议吗?
请记住,文本可能很长(1000个字符+),显示在~20个字符/屏幕,〜4个像素/秒到1920x280px小部件,字体不是等宽字体。我曾想过使用OpenGL和GlSurfaceView,但是在这里问题保持不变,在高系统负载期间我仍然需要知道,我目前正在渲染什么。
平台依赖解决方案也非常受欢迎,因为我可以控制可能支持的平台(可能是一个非常狭窄而非主流的范围)。
提前感谢您的帮助。