【问题标题】:Android: Performance 'hickups' in live wallpaper applicationAndroid:动态壁纸应用程序中的性能“打嗝”
【发布时间】:2012-01-17 09:52:56
【问题描述】:

我正在编写的动态壁纸应用程序遇到一些问题。

我正在使用 OpenGL 1.0 进行渲染。总的来说,我得到的表现相当不错。在三星 Galaxy S2 (2.3.4) 上,我可以在没有帧限制的情况下获得 60 FPS。

但有时我会得到一些比其他帧大得多的帧(假设正常帧为 33 毫秒,尖峰帧约为 70-100 毫秒)。这会定期发生,大约每秒一次。

我的代码每帧都进行完全相同的处理,因此这种行为是异常的。看起来我的线程由于某种原因被操作系统交换/延迟,或者只是 VM 在某个时候开始执行较慢。

减速不是由于 GPU 处理,因为 eglSwapBuffers 从不等待。我也很确定我的进程不会导致 GC 运行,因为我确保循环中没有任何短期对象(在 DDMS 分配跟踪器中验证)。

有趣的是,如果我将手指放在屏幕上,帧时间的尖峰往往会变得相当小。好像操作系统因此提高了进程的优先级。

解决这个问题非常重要,因为当出现尖峰时我的动画看起来很糟糕。

有没有其他人遇到过同样的问题?任何有关可能导致问题的提示也将不胜感激。

【问题讨论】:

    标签: java android performance opengl-es


    【解决方案1】:

    看来你是对的。作为动态壁纸,你不应该是唯一的活动线程,所以每当另一个应用程序需要做它的事情时,你就会得到延迟。据我所知,你无法控制这一点。在我的一个应用程序中,更糟糕的是当我收到一封电子邮件时,我会被冻结半秒。在您的情况下,定期间隔让我认为另一个进程每秒左右检查一次。有时您会在 logcat 中获得提示,每次都会显示一个重复的过程。

    我对此没有解决方案,但有什么帮助(取决于您的动画的性质 - 这是假设您使用每一帧作为时间步长进行动画制作,如果没有,请道歉)是使用实际最后一帧和当前帧之间经过的时间。任何尖峰都会“冻结”显示,但不会冻结动画。这很微妙,但有时可能就足够了。

    【讨论】:

      【解决方案2】:

      对我来说,您所描述的内容听起来像是一个很长的垃圾收集过程。 [编辑] 您提到您已经减少了分配 - 也许还有另一个应用程序或库导致了峰值?

      线程上下文切换会发生,但除非您非常接近 CPU 使用率的限制(即每帧使用 16 毫秒的 CPU 功率),否则这不会是您的问题。您目前几乎可以肯定受到 GPU 帧缓冲区切换频率的限制(每秒最多 60 次切换。)

      我还要说,动态壁纸通常应该可以选择将更新频率限制为 15fps。电池消耗是动态壁纸需要认真考虑的一个因素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多