2013-10-21 23 views
0

我編寫一個60 FPS遊戲,需要找到那些嚴重影響遊戲循環性能的代碼段。我現在在幀的開始存儲一個納秒時間戳,並將我的代碼分成邏輯部分,例如「渲染粒子」或「遍歷敵方AI」。完成每個部分的執行後,我將存儲自上一部分完成後執行代碼所需的執行時間。最後,我檢索總執行時間([納秒現在]減去[第一納秒時間戳])並計算每個代碼段執行時間的百分比。這使我可以顯示每個部分所佔的百分比,但似乎並不是完美的解決方案。我猜GC隨機影響代碼段執行。Java/Dalvik - 比較代碼段執行時間

有沒有更好的方法可以實現,甚至是一個API /分析工具來做到這一點?

+1

http://developer.android.com/tools/debugging/debugging-tracing.html – GriffeyDog

+0

謝謝。收藏成功!我使用的LibGDX允許編寫遊戲邏輯一次,並且在部署桌面或Android(LWJGL/OpenGL ES)時擴展特定於平臺的代碼。我想先優化桌面版本,那麼有沒有好的Windows分析器? – Aich

+0

[Visual VM](http://docs.oracle.com/javase/7/docs/technotes/guides/visualvm/)可能是最常見的。 – GriffeyDog

回答

0

其中一位評論者推薦traceview,它通常用於檢測用Java編寫的代碼來確定什麼是緩慢的。對於Java和本地組合來說,它的用處不大(因爲工具不成比例地減慢了Java代碼),並且當您試圖確定在使用OpenGL生成幀時是否滿足或缺少最後期限時,缺乏有用的上下文。

執行此類分析的首選方法是使用systrace(doc,explanation)。正如您從第二個鏈接中看到的,您可以將您的應用程序時間線直接與vsync事件和曲面組合作業進行比較。

如果您運行的是Android 4.3(API 18)或更高版本,則可以添加own events。將這些添加到應用程序中的戰略位置可以更容易地查看瓶頸。一個簡單的例子可以找到here。 (截至我寫這篇文章時,官方文檔還沒有描述4.3命令行的用法,所以最簡單的就是遵循這個例子。)

Android 4.3還添加了「dalvik」標籤;如果包含,您的跟蹤將顯示GC暫停開始和結束的位置,以及有關哪些線程實際掛起的詳細信息。

+0

這正是我需要分析滯後的原因。我想我試圖找到方法時使用了錯誤的搜索標記。謝謝! – Aich