我正在开发一款android游戏,并且在开发过程中我开始注意到有点迟缓,所以我想尝试利用多线程来获得乐趣和学习。解读多核性能跟踪(Eclipse/Android)
我的应用程序具有3个线程:
- UI线程(应该大部分空闲)
- 游戏逻辑线程
- 图形线程
我最小化线程2和之间的临界部3尽我所能,认为游戏逻辑可以独立于渲染线程进行更新,然后在两个线程结束时,我可以有一个尽可能短的窗口,在那里我将所有图形从逻辑线程更新到游戏循环。这应该允许两个线程在绝大多数时间独立工作。理论上听起来像是一场表演胜利。
但是,一旦我开始实施,我的表现就大大下降了。它比以前差得多,一个更新和渲染循环花费了50毫秒(20fps),所以看起来像垃圾。这只是渲染了大约20个三角形和20个纹理四边形,这是一个非常简单的工作负载(我害怕当我实现适当的图形时会发生什么)。
无论如何,我采取了Android的DDMS跟踪配置文件哪里出错或可以改善。
http://i.stack.imgur.com/DDUYE.png
这是我的游戏的大致3个帧的图。到目前为止,它似乎在做我大概的预期。以蓝色突出显示的部分是锁定部分,该部分看起来是正确的(保持glThread在锁定状态时大部分时间处于等待状态)。然而,一旦我解开它,我应该看到两个线程同时工作,它看起来像他们,但如果我仔细看:
http://i.stack.imgur.com/vukXQ.png
我在做开发的双核手机,但如果我理解了跟踪权,它看起来并不像平行做任何事情,更糟的是它似乎是每毫秒切换活动线程数百次! (除非我解释错误)。所有这些上下文切换看起来对性能来说都会很糟糕,所以我不确定它为什么要这么快速地来回切换。
所以我的长篇大论的解释后,我想知道的几件事情:
- 我的理解是正确的,即在跟踪填充矩形是活动线程,和彩色线条是睡眠的线程?否则它们是什么意思?
- 为什么我看不到我的线程同时在一个所谓的双核心手机上运行?
- 为什么它切换活动线程这么快?
- 在DDMS中,我收到警告“警告:调试程序处于活动状态;方法跟踪结果会出现偏差”。这有什么好担心的吗?我怎样才能摆脱这个警告?(我通过运行launced的应用程序,而不是通过调试,如果它有差别)
您使用哪个版本的Android进行性能分析?我注意到不同版本的不同行为。 – rmtheis 2012-07-31 23:18:20
...并且您是否使用AsyncTask创建线程? – rmtheis 2012-09-24 07:55:43
@rmtheis - Android 2.3,不,他们不是asynctask。线程一是一个GLSurfaceView线程,另一个是一个新的'Thread',以'Thread.start()'开始。 – Tim 2012-09-24 15:17:45