2012-01-19 38 views
-3

我有一個或多或少完成的Java遊戲。敵人從屏幕的頂部產生,並與屏幕底部的單位戰鬥。遊戲耗用了大量的CPU,我認爲這部分是因爲每次敵人產生時,它都會有一個線程。當它死亡時,敵人的記憶空間不會被刪除,線程也不會被銷燬。我要問的是,會否刪除敵人提高效率,如果是這樣,怎麼樣?另外,你們有沒有其他方法可以提高效率?編程效率

+1

可以顯示我們的小代碼片段?爲什麼在敵人死亡後線不停止? – aayoubi

+1

「提高效率的其他方法」完全取決於您如何編寫遊戲代碼。沒有太多可以做的超級常規優化。有一些[設置](http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp),如果內存或堆棧限制是問題,您可以在客戶端進行更改(但它們不應該「 t be)。 – darvids0n

+3

我們沒有什麼可以繼續下去的。 –

回答

7

你需要的是一個profiler

您需要摒棄爲什麼程序運行緩慢的猜測。你最終可能會浪費大量的時間來清理線程分配,結果發現它並不是性能瓶頸。

Java中有不同的分析器,您最終使用的分析器可能取決於您的編程環境。就我個人而言,我使用Netbeans IDE進行開發,我會推薦使用它,它具有良好的profiler。如果您開發使用Eclipse IDE,有VisualVM和更多的選擇看這個問題:

https://stackoverflow.com/questions/2713940/eclipse-java-profiler

+0

謝謝,我將使用NBeans分析器。 – Jimmt

3

好,遊戲通常不會使用這些方法開發!

你需要做的第一件事是擺脫你創建和銷燬的所有線程,在遊戲中我們通常只有一個活動線程。我知道,使用多核CPU的全部功能是非常好的,但這對專家來說是很好的。作爲獨立開發者,我知道我的遊戲需要運行的性能,所以我只使用線程來阻止呼叫。比如等待網絡數據包到達。

現在知道你只需要一個活動的線程,這裏是遊戲通常會做的!

  • 檢查用戶輸入
  • 更新場景
  • 渲染幀

而遊戲循環通過相同的週期反覆。請注意,許多顯示器不刷新頻率高於60Hz,如果他們這樣做,我不知道任何人都可以真正注意到!因此,以超過60fps的速度渲染遊戲只會浪費處理能力。檢查用戶輸入並更新場景也是一樣。如果用戶沒有從遊戲中獲得任何新的數據,他就無法迴應;所以檢查輸入並沒有真正改變! 「更新場景」部分也是一樣的。如果用戶沒有做任何新的事情,我們也不會畫任何東西,爲什麼我們關心世界上發生的事情?我們可以讓所有更改堆積起來,然後將其應用於一個重大更新中。在這裏,我正在談論一個通常在所有遊戲中實施的fps限制,以防止濫用計算能力。無論是CPU還是GPU,計算量過大都會導致更高的功耗,而移動設備或筆記本電腦用戶無法獲得回報!

你提到過你的遊戲中有一些AI。正如你所猜測的,任何與遊戲互動的東西都有兩個明顯的步驟!

  1. 觀察遊戲狀態
  2. 拍動作

我們可以收拾了整個事情了在think()方法。考慮到這些呼叫並不會消耗太多時間,我們可以將它們稱爲遊戲中所有非人類思維的事物,並且進行這些呼叫的最佳位置是當您檢查用戶輸入時。至少他們可以被認爲是用戶,除了電腦是爲他們所認爲的,他們註定要被熟練的玩家毆打!這些所謂的AI代理商是否需要溝通並不重要。讓他們儘可能多地彼此交談,但只在他們觀察比賽的時候。

由於蒂姆建議使用配置文件是一件好事,找到你的遊戲的瓶頸。但它可能總是有用的。有時你會發現你的代碼的一部分出現了問題,它的執行效果很好。在這些情況下不要嚇壞了!如果你遇到這種情況,你可以每2或3幀做一次這些東西;這沒什麼大不了的!只需檢查遊戲是否完美運行即可。

最後一個提示:記住你正在開發一款遊戲。如果由於某種原因要實現彈簧,則不需要像在物理模擬中那樣計算力和速度,但一個簡單的sin函數就可以實現這個功能!而這些技巧有時比實際驗證的方法更好。在遊戲中,用戶喜歡看到最好的結果,但幾乎沒有人關心是否所有內容都按照牛頓的規定實施!