2012-03-08 80 views
18

我正在开发一款android游戏,并且在开发过程中我开始注意到有点迟缓,所以我想尝试利用多线程来获得乐趣和学习。解读多核性能跟踪(Eclipse/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中,我收到警告“警告:调试程序处于活动状态;方法跟踪结果会出现偏差”。这有什么好担心的吗?我怎样才能摆脱这个警告?(我通过运行launced的应用程序,而不是通过调试,如果它有差别)
+0

您使用哪个版本的Android进行性能分析?我注意到不同版本的不同行为。 – rmtheis 2012-07-31 23:18:20

+0

...并且您是否使用AsyncTask创建线程? – rmtheis 2012-09-24 07:55:43

+0

@rmtheis - Android 2.3,不,他们不是asynctask。线程一是一个GLSurfaceView线程,另一个是一个新的'Thread',以'Thread.start()'开始。 – Tim 2012-09-24 15:17:45

回答

4

非常好的问题,让我先回答:

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

希望你会发现这个答案有帮助。

1

谢谢你的问题。内部人员的全面回答也会对我有所帮助。我会说我知道的。

  • 某些(所有?)电话可以选择启用/禁用第二个内核。你有没有检查你的开启?

  • 在我自己的应用程序中,我注意到仅仅从一个线程到两个线程(在一个核心上)没有改变总的工作量会导致1.5倍的放缓,所以清晰的线程本身就有成本。

  • 它一直在新闻英特尔呼吁谷歌退出对执行不力的多核线程的:

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

    你的结果验证了这一点。其他

  • 有一点要记住的是,多核是不支持多处理器。您在核心之间共享缓存和内存控制器带宽。可以在等待另一个用共享资源完成时拖延,特别是在共享高速缓存线上写入时。但是,这种效果不应该解释您所看到的单线程。

+0

回复:子弹1:我找不到任何选项来启用/禁用姜饼下的第二个核心,我怀疑任何人都会推出双核心手机,默认禁用第二个核心。 – Tim 2012-06-15 18:56:06

+0

Re#3和#4,“执行不力”是一回事,但“零执行”是另一回事。在两个线程同时激活的整个跟踪视图中没有一个飞秒。我还认为,英特尔的主张可能与英特尔试图推销其单核处理器有关。我想知道traceview是否在多核手机上无法正常工作?无论如何感谢您的反馈。 – Tim 2012-06-15 18:57:27

+1

“不好的实施”可能意味着有相当不受限制的条件,根本不使用第二个核心。 (OpenGL驱动程序调用?JNI?这些都是疯狂的猜测。)另一个可能的糟糕的实现是分配每个进程的核心关联,而不是每个线程。 (我猜你的应用程序正在运行一个进程。) – Gene 2012-06-16 02:44:48