【问题标题】:Android thread performance/priority on Galaxy Note 2 when screen is touched/released触摸/释放屏幕时 Galaxy Note 2 上的 Android 线程性能/优先级
【发布时间】:2014-02-05 23:56:31
【问题描述】:

我有一个适用于 Android 的 OpenGL 游戏。触摸屏幕时,它以 60fps 的速度运行。当我松开手指时,它又回到了 30fps 左右。触摸事件/释放是否会提高/降低线程的优先级,如果是这样,我该如何复制它以使其保持恒定的 60fps。到目前为止,这似乎只是 Galaxy Note 2 上的问题。

【问题讨论】:

  • 30fps 结果还不错。人类每秒可以看到 24 帧:)

标签: android multithreading opengl-es-2.0 glsurfaceview


【解决方案1】:

我假设您使用的是 onDrawFramesetRenderMode(RENDERMODE_CONTINUOUSLY)

30 和 60FPS 表示您的 onDrawFrame 实现在设备的屏幕刷新时被调用。大多数显示器以 60Hz 刷新,为您提供 60FPS。

Galaxy Note 2 可能有一些省电功能,当屏幕上没有触摸时将屏幕刷新限制为 30Hz。检查是否有任何方法可以禁用此功能。

AFAIK,OpenGL ES 没有指定屏幕刷新率的标准,尽管 FPS 存在差异,但您需要一个节流功能来确保您的游戏运行/感觉相同(即以相同的速度)。

【讨论】:

    【解决方案2】:

    是的。

    观察这种现象的最佳方法是使用启用了“freq”标签的systrace。您可能需要一个 root 设备,而且您肯定需要一个启用了 systrace 的设备。

    systrace 将记录各种组件的时钟频率变化。它因设备而异,但您通常可以获得每核 CPU 时钟和 GPU 内存速率。您可能会在帧速率下降的同时看到其中几个显着下降。

    这样做的目的是降低电源需求并延长电池寿命。假设是,当您的手指与屏幕接触时,您正在积极地做某事,并且设备应该尽可能地响应。短暂的一段时间后,时钟将减慢到适合当前工作负载的水平。确定在减速前等待多长时间以及减速多少的启发式方法已针对每个设备进行了调整。

    (这导致一些人创建了一个仅在多核设备上运行和旋转的线程,以人为地提高 CPU 时钟频率。不推荐。另请参阅this answer。)

    底线是,这不是调整线程优先级的简单问题。您必须在认识到减速会发生并适应它(通过使您的游戏更新独立于帧速率)之间做出选择,或者在您想要流畅的动画时找出一些方法来欺骗设备保持在更高功率模式下。

    (对于任何想在家一起玩的人:建立一个Grafika 的副本并启动“记录 GL 应用程序”活动。如果你在屏幕上拖动手指一切都会好起来的,但如果你别管它几秒钟后,您可能会开始看到丢帧计数器上升,因为应用程序落后了。在 Nexus 5、Nexus 7 (2013) 等上可以看到。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      • 2012-11-17
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多