2012-03-08 31 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