解释多核性能跟踪(Eclipse/Android)

Tim*_*Tim 18 eclipse debugging multithreading android

我正在开发一款安卓游戏,我开始注意到在开发过程中有点迟钝,所以我想尝试利用多线程来获得乐趣和学习.

我的应用程序有3个主题:

  1. UI线程(应该大多是空闲的)
  2. 游戏逻辑线程
  3. 图形线程

我尽可能地最小化了线程2和3之间的关键部分,并且认为游戏逻辑可以独立于渲染线程进行更新,然后在两个线程的末尾我可以有一个尽可能短的窗口,我推动所有图形从逻辑线程更新到游戏循环.这应该允许两个线程在大多数情况下独立工作.理论上听起来像是表演胜利.

然而,一旦我开始实施,我的表现就大了不少.它比以前更糟糕,一个更新和渲染循环花了50毫秒(20fps),所以它看起来像垃圾.这只是渲染大约20个三角形和20个纹理四边形,这是一个非常简单的工作量(我不敢想到当我实现适当的图形时会是什么).

无论如何,我在android中使用DDMS跟踪来描述出现问题或者可以改进的地方.

TRACE1 http://i.stack.imgur.com/DDUYE.png

这是我游戏大约3帧的视图.到目前为止,它似乎大致按照我的预期行事.以蓝色突出显示的部分是锁定部分,它看起来是正确的(保持glThread在锁定时大多等待).然而,一旦我解锁它,我应该看到两个线程同时工作,看起来它们是,但如果我仔细观察:

TRACE2 http://i.stack.imgur.com/vukXQ.png

我正在双核手机上进行开发,但如果我理解了它的正确性,它看起来并不像是并行执行任何操作,而且更糟糕的是它似乎每毫秒切换活动线程数百次!(除非我不正确地解释这个).所有这些上下文切换似乎对性能都很糟糕,所以我不确定为什么它会如此快速地来回切换.

因此,在我冗长的解释之后,我想知道一些事情:

  1. 我的理解是正确的,跟踪中填充的矩形是活动线程,彩色线条是睡眠线程吗?否则他们是什么意思?
  2. 为什么我没有看到我的线程同时在所谓的双核心手机上运行?
  3. 为什么它如此迅速地切换活动线程?
  4. 在DDMS中,我收到警告"警告:调试器处于活动状态;方法跟踪结果将会出现偏差".这有什么值得担心的吗?我怎么能摆脱这个警告?(我通过Run launce app,而不是通过Debug,如果它有所作为)

Tom*_*omo 4

非常好的问题,让我从答案开始:

  1. 您混淆了线程/方法/activeMethod。Traceview 中的每一行都是线程(如果您命名了线程,您将在左侧看到它的名称,例如“GL Thread”、“main”等)。矩形(彩色)表示每个线程内活动的执行方法,而彩色线表示线程内“暂停”的方法。通过“暂停”,我的意思是“方法仍在执行,但上下文已切换到其他线程,当上下文再次切换到该线程时,该方法将继续工作。用您在问题中使用的术语来说,是的, lines 是休眠线程的方法,矩形是活动线程执行的方法。您可以在此处找到有关 DDMS Traceview 的更多信息
  2. 在内核之间分配线程是另一回事,并且在很大程度上取决于底层 Android 操作系统机制。首先,确保目标 Android 操作系统启动时启用了 SMP(对称多处理)选项,这是多核手机的默认情况,我猜:),但我不是这些方面的专家。您可以在这里找到有关 SMP 的一些文字
  3. 线程切换取决于操作系统线程/进程调度程序、线程优先级等。有关此内容的更多信息,您可以在这个答案中找到。
  4. 即使您在非调试模式下运行应用程序,当您连接 DDMS 并执行方法分析等操作时,您也会激活 davlik vm 的调试部分。有关调试的更多详细信息,请参见“实现”部分。

希望这个答案对您有所帮助。