我編寫了一個非常簡單的Java 2D遊戲,只有兩個線程 - 音樂播放器和遊戲。我注意到當我開始遊戲時,CPU利用率從20%上升到70%。我想在遊戲中進行很多處理甚至還沒有實現!降低Java程序中的CPU利用率
這是一個問題嗎? - 不應該是一個簡單的遊戲不會生豬這麼多的CPU?
如果是關注點;通用編碼實踐或設計模式是什麼,以避免利用率的巨大飛躍(除了沒有多線程)?
我編寫了一個非常簡單的Java 2D遊戲,只有兩個線程 - 音樂播放器和遊戲。我注意到當我開始遊戲時,CPU利用率從20%上升到70%。我想在遊戲中進行很多處理甚至還沒有實現!降低Java程序中的CPU利用率
這是一個問題嗎? - 不應該是一個簡單的遊戲不會生豬這麼多的CPU?
如果是關注點;通用編碼實踐或設計模式是什麼,以避免利用率的巨大飛躍(除了沒有多線程)?
如果這是一個問題,通用編碼實踐或設計模式是什麼,以避免利用率的巨大飛躍(除了沒有多線程)?
大多數遊戲引擎都有一個稱爲每秒60次的遊戲邏輯更新功能,並且一個繪圖函數在計算機有資源(但不超過邏輯更新)的情況下經常調用。
一般的編碼習慣這裏是你不想更新比你需要的遊戲。試着在你的主循環中放一個計數器,並在10秒內看到它被調用了多少次?如果每秒運行60多個更新,則不需要此CPU負擔!
看起來你不使用的遊戲引擎,讓你這個,所以你可以砍在一起的解決方案:有你的主while
循環查找當前時間(Java的DateTime
爲您提供精確到毫秒,whcih是不夠好)然後將它與最後一個循環的更新時間進行比較。如果沒有足夠的時間,請在遊戲等待運行下一次迭代時使用Thread.sleep()
來減輕CPU的負擔!
最後一個評論:
(比沒有多線程等)
雖然具有CPU線程切換的開銷引起一點點,我不認爲使用許多精心編寫線程應該讓CPU工作更加努力(我假設工作的總和與更少的線程相同)。事實上,如果你的機器是多核心的,它會讓你的遊戲工作更快,如果有一部分它需要CPU(假設你的線程併發而不是相互阻塞)!
我會CPU和內存配置文件的應用程序,看看它在做什麼來提高效率。
這裏的答案是衡量你的程序,並看到CPU正在使用如何你期望它。機率是你會發現一些令人驚訝的,當你測量它。市場上有很多好的Java分析器來做到這一點。我使用JProfiler,我很滿意。一個窮人的方法是使用pstack獲取Java線程轉儲。做幾個轉儲,看看它在做什麼。或者只是在IDE中進行調試並在各個點上進行中斷。
這是一個問題嗎? - 不應該是一個簡單的遊戲不會生豬這麼多的CPU?
無所事事可以佔用整個CPU,例如,這段代碼
public static void main(String[] args) {
while(true){
}
}
顯示我PC上的CPU使用率爲100%。所以雖然你的'簡單'遊戲可能不會有很多,但如果執行得不好,它肯定會佔用大量的CPU能力。
使用性能分析工具(如JProfiler)可以真正幫助您確定所有CPU將要運行的位置。不確定是否有免費的分析器。但是,像JConsole和VisualVM(通常都包含在JDK)免費工具也可以是有用的快速查看哪些Thread
s爲活躍,佔據了大部分的CPU
我喜歡在我的程序的情況......我還以爲是在遊戲中的標準有一個「遊戲循環」調用子程序,直到比賽贏或輸的遊戲條件滿足。這是不對的?也許我應該把它移到遊戲開發中。現場。 – PinkElephantsOnParade 2012-07-20 18:57:27
我不是一個遊戲開發商,但我想你只需要運行在特定的時間循環,而不是所有的定時器(例如像(http://stackoverflow.com [動畫可以通過使用'Timer'完成] /問題/ 9849950 /東西,似乎-錯用最佈局的JButton-顯示,意外性的行爲在-R)) – Robin 2012-07-20 19:04:07
我提出這樣的問題到gamedev堆棧交換。不過感謝程序員的方法! – PinkElephantsOnParade 2012-07-20 20:18:28
的最好的方式找到CPU & memoryutilization ...是使用分析器 如JConsole的或jvisualvm ..
你可以找到同樣在你的JDK
C:〜/ JDK /斌/ JConsole的或C:〜/ JDK /斌/ jvisualvm
當CPU峯值變高時,將採用相應的堆棧幀。 您將能夠看到當前正在執行的線路,其中有更多CPU正在使用。
確保您分析您的應用程序並對線程數進行基準測試。
它什麼都不做的線程可以不佔用CPU資源的50%。你有沒有試圖分析你的代碼? – Edmondo1984 2012-07-20 18:35:13