免费
我正在为尚未定义的硬件平台(目前正在测试 Ouya 和 MK802IV,所有 Android 4.1+)开发一个基于 Android 的应用程序,其中涉及将各种内容显示到 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,但是这里的问题仍然存在,在高系统负载期间,我仍然需要知道,我目前正在渲染什么。
依赖于平台的解决方案也非常受欢迎,因为我将控制可以支持的平台(可能是一个非常狭窄且不是主流的范围)。
预先感谢您的帮助。