2012-07-20 178 views
0

我編寫了一個非常簡單的Java 2D遊戲,只有兩個線程 - 音樂播放器和遊戲。我注意到當我開始遊戲時,CPU利用率從20%上升到70%。我想在遊戲中進行很多處理甚至還沒有實現!降低Java程序中的CPU利用率

  1. 這是一個問題嗎? - 不應該是一個簡單的遊戲不會生豬這麼多的CPU?

  2. 如果是關注點;通用編碼實踐或設計模式是什麼,以避免利用率的巨大飛躍(除了沒有多線程)?

+1

它什麼都不做的線程可以不佔用CPU資源的50%。你有沒有試圖分析你的代碼? – Edmondo1984 2012-07-20 18:35:13

回答

1

如果這是一個問題,通用編碼實踐或設計模式是什麼,以避免利用率的巨大飛躍(除了沒有多線程)?

大多數遊戲引擎都有一個稱爲每秒60次的遊戲邏輯更新功能,並且一個繪圖函數在計算機有資源(但不超過邏輯更新)的情況下經常調用。

一般的編碼習慣這裏是你不想更新比你需要的遊戲。試着在你的主循環中放一個計數器,並在10秒內看到它被調用了多少次?如果每秒運行60多個更新,則不需要此CPU負擔!

看起來你不使用的遊戲引擎,讓你這個,所以你可以砍在一起的解決方案:有你的主while循環查找當前時間(Java的DateTime爲您提供精確到毫秒,whcih是不夠好)然後將它與最後一個循環的更新時間進行比較。如果沒有足夠的時間,請在遊戲等待運行下一次迭代時使用Thread.sleep()來減輕CPU的負擔!

最後一個評論:

(比沒有多線程等)

雖然具有CPU線程切換的開銷引起一點點,我不認爲使用許多精心編寫線程應該讓CPU工作更加努力(我假設工作的總和與更少的線程相同)。事實上,如果你的機器是多核心的,它會讓你的遊戲工作更快,如果有一部分它需要CPU(假設你的線程併發而不是相互阻塞)!

0

我會CPU和內存配置文件的應用程序,看看它在做什麼來提高效率。

1

這裏的答案是衡量你的程序,並看到CPU正在使用如何你期望它。機率是你會發現一些令人驚訝的,當你測量它。市場上有很多好的Java分析器來做到這一點。我使用JProfiler,我很滿意。一個窮人的方法是使用pstack獲取Java線程轉儲。做幾個轉儲,看看它在做什麼。或者只是在IDE中進行調試並在各個點上進行中斷。

3

這是一個問題嗎? - 不應該是一個簡單的遊戲不會生豬這麼多的CPU?

無所事事可以佔用整個CPU,例如,這段代碼

public static void main(String[] args) { 
    while(true){ 

    } 
    } 

顯示我PC上的CPU使用率爲100%。所以雖然你的'簡單'遊戲可能不會有很多,但如果執行得不好,它肯定會佔用大量的CPU能力。

使用性能分析工具(如JProfiler)可以真正幫助您確定所有CPU將要運行的位置。不確定是否有免費的分析器。但是,像JConsoleVisualVM(通常都包含在JDK)免費工具也可以是有用的快速查看哪些Thread s爲活躍,佔據了大部分的CPU

+0

我喜歡在我的程序的情況......我還以爲是在遊戲中的標準有一個「遊戲循環」調用子程序,直到比賽贏或輸的遊戲條件滿足。這是不對的?也許我應該把它移到遊戲開發中。現場。 – PinkElephantsOnParade 2012-07-20 18:57:27

+0

我不是一個遊戲開發商,但我想你只需要運行在特定的時間循環,而不是所有的定時器(例如像(http://stackoverflow.com [動畫可以通過使用'Timer'完成] /問題/ 9849950 /東西,似乎-錯用最佈局的JButton-顯示,意外性的行爲在-R)) – Robin 2012-07-20 19:04:07

+0

我提出這樣的問題到gamedev堆棧交換。不過感謝程序員的方法! – PinkElephantsOnParade 2012-07-20 20:18:28

1

的最好的方式找到CPU & memoryutilization ...是使用分析器 如JConsole的或jvisualvm ..

你可以找到同樣在你的JDK

C:〜/ JDK /斌/ JConsole的或C:〜/ JDK /斌/ jvisualvm

當CPU峯值變高時,將採用相應的堆棧幀。 您將能夠看到當前正在執行的線路,其中有更多CPU正在使用。

確保您分析您的應用程序並對線程數進行基準測試。