【问题标题】:Android: OpenGL rendering pauses when heavy background task runningAndroid:当繁重的后台任务运行时,OpenGL 渲染暂停
【发布时间】:2012-10-24 04:15:54
【问题描述】:

我正在通过 OpenGL 渲染对象,并且在大多数情况下都能获得 60fps 的平滑帧速率。 直到我在后台线程中做一些繁重的事情,比如从 REST API 中获取东西,处理它,然后将对象添加到图中(低优先级的东西,我更关心 UI 流动性)。然后渲染器将暂停很长一段时间,最多 1 秒(大约只要后台线程运行),然后像什么都没发生一样恢复。我注意到这一点是因为动画同时开始,并且在此期间卡住了。后台线程设置为最低优先级,垃圾收集确实需要 100-200 毫秒,但不是整个秒。当我在后台任务中的任意位置设置调试点时,渲染继续正常,没有任何延迟。

我繁重的后台线程是否有可能饿死 OpenGL 线程?如果是这样,我该怎么办?

【问题讨论】:

  • 看起来很像this performance trace...
  • 不知道是什么 GPU,它是 Galaxy Nexus。回家后在模拟器上测试一下。
  • Stefan,您发布的帖子提到“有点迟钝”,而我有整整一秒钟没有渲染。我不认为这是相关的。
  • 你需要在我的名字前加一个@,否则我不会收到通知。该跟踪清楚地显示线程没有并行运行。无论是小任务还是重任务,都无所谓。你是对的,我不能说它真的很相关......

标签: android opengl-es frame-rate


【解决方案1】:

当然!需要为 GPU 提供数据,而这是由 CPU 完成的。因此,如果系统出现瓶颈,例如 I/O 或 CPU 处理,那么 GPU 将无法获得支持。例如,动画传统上是在 CPU 上完成的。这就是为什么您可以在 PC 上使用相同的图形芯片但使用不同的 CPU 获得更高帧速率的许多游戏。

我也同意分​​析是一个非常好的主意。如果可以的话,我建议进行分析以确保它实际上是 REST 调用,或者 REST 调用是否是许多事情之一

我注意到关于 REST 处理的一件事,这发生在我身上。由于 REST 有时会处理大量字符串,并且如果您不使用 StringBuilder,最终可能会触发大量垃圾收集。但是,听起来您并没有得到这个。

【讨论】:

  • 那么,为什么要允许调度程序在馈送 GPU 管道之前放置一个后台线程呢?这没有任何意义。如果是这样,为什么 Google 的工程师不给渲染线程更高的优先级?
  • 有时是 Java 必须释放 RAM,尤其是在 REST 调用的情况下,这往往会进行一些字符串处理
  • 我已经提到垃圾收集在这里不是问题,因为 GC 暂停时间不长。它们更像是最大 100-200 毫秒,而不是 1.5 秒。
猜你喜欢
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
相关资源
最近更新 更多