我正在使用我正在编写的动态壁纸应用程序遇到一些问题。
我正在使用OpenGL 1.0进行渲染。总的来说,我得到的表现相当不错。在三星Galaxy S2(2.3.4)上我可以获得60 FPS而不受帧限制。
然而,我不时会得到一些比其他帧大得多的帧(假设正常帧是33ms而尖峰帧大约是70-100ms)。这种情况定期发生,大约每秒一次。
我的代码每帧执行完全相同的处理,因此此行为异常。看起来我的线程由于某种原因被操作系统交换/延迟,或者只是VM在某些时候开始执行速度较慢。
减速不是由于GPU处理,因为eglSwapBuffers永远不会等待。我也很确定我的进程不会导致GC运行,因为我确保循环中没有任何短暂的对象(在DDMS分配跟踪器中验证)。
一个有趣的事情是,如果我将手指放在屏幕上,则帧时间中的尖峰会变得相当小。好像操作系统因此而提升了流程的优先级。
解决这个问题非常重要,因为当出现尖峰时,我的动画看起来非常糟糕。
其他人是否遇到过同样的问题?关于可能导致问题的任何提示也将不胜感激。
答案 0 :(得分:0)
看起来你是对的。作为动态壁纸,您不应该是唯一的活动主题,因此每当其他应用程序需要执行此操作时,您将得到延迟。据我所知,你无法控制这一点。在我的一个应用程序中,更糟糕的是当我收到一封电子邮件时,我得到了半秒的冻结。在您的情况下,定期间隔让我认为另一个进程每隔一秒左右检查一次。有时你会在logcat中得到提示,每次都会出现重复的过程。
我没有这方面的解决方案,但是有什么帮助(取决于动画的性质 - 这假设你使用每一帧作为时间步的动画,如果没有道歉)是使用实际最后一帧和当前帧之间经过的时间。然后任何尖峰将“冻结”显示,而不是动画。它很微妙,但有时它可能就足够了。
答案 1 :(得分:0)
你所描述的内容听起来像是一个漫长的垃圾收集传递给我。 [编辑]你提到你已经削减了你的分配 - 也许还有另一个应用程序或库导致了峰值?
将发生线程上下文切换,但除非你非常接近CPU使用率的限制(即你每帧使用16ms的CPU功率),否则这不会是你的问题。您目前几乎肯定受到GPU帧缓冲器开关频率的限制(每秒最多60个开关。)
我还要说动态壁纸一般应该可以选择将更新频率限制在15fps。电池耗尽是您需要认真考虑的动态壁纸因素。