我正在開發一款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