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

时间:2012-03-08 04:38:17

标签: android eclipse multithreading debugging

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

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

  1. UI线程(应该大部分都是空闲的)
  2. 游戏逻辑主题
  3. 图形线程
  4. 我尽可能地最小化了线程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启动应用程序,如果它有所作为,则不通过Debug)

2 个答案:

答案 0 :(得分:4)

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

  1. 你混淆了线程/方法/ activeMethod。 traceview中的每一行都是线程(如果你命名了你的线程,你会在左侧看到它的名字,比如“GL Thread”,“main”等等。)。矩形(彩色)表示每个线程内的活动执行方法,而彩色线表示线程内部的“暂停”方法。通过“暂停”,我的意思是“方法仍在执行,但上下文切换到其他线程,当上下文再次切换到此线程时,此方法将继续工作。在术语中,您已经在您的问题中使用了, line是休眠线程的方法,而rectangle是活动线程执行方法。你可以找到more info about DDMS traceview here
  2. 在核心之间分配线程是另一个故事,在很大程度上取决于底层的Android OS机制。首先,确保目标Android OS是在启用SMP(对称多处理)选项的情况下启动的,这是多核手机的默认情况,我猜:),但我不是那些专家。 Some words about SMP you can find here
  3. 线程切换取决于操作系统线程/进程调度程序,线程优先级等。有关此内容的更多信息,您可以find in this answers.
  4. 即使您在非调试模式下运行应用程序,当您使用DDMS连接并执行方法分析时,您也将激活davlik vm的调试部分。 More details about debugging here, section "Implementation".
  5. 希望你会发现这个答案很有帮助。

答案 1 :(得分:1)

感谢您的提问。内部人员的完整答案对我也有帮助。我会说出我所知道的。

  • 某些(全部?)手机可以选择启用/禁用第二个核心。你检查过你的了吗?

  • 在我自己的应用程序中,我注意到仅仅从一个线程到两个线程(在一个核心上)并且总工作量没有变化导致1.5倍的减速,因此显然线程本身有成本。

  • 有消息称,英特尔正在呼吁Google解决多核线程执行不力问题:

    http://www.pcworld.com/article/257307/dual_core_processors_wasted_on_android_intel_claims.html

    您的结果验证了这一点。

  • 要记住的另一件事是多核不是多处理器。您在内核之间共享缓存和内存控制器带宽。在等待另一个用共享资源完成时,可以停止,特别是对于共享高速缓存行上的写入。但是,这种影响不应该考虑到您所看到的单线程。