2011-03-04 61 views
2

我喜歡製作遊戲,現在第一次在移動設備上嘗試自己。在那裏,性能當然是一個比在一臺不錯的個人電腦上更大的問題,我發現自己特別在武器(或者更確切地說是子彈)階級設計中掙扎。 他們需要更新很多,被破壞/創造了很多,通常需要更新。我現在做這個顯而易見的方法時,我每次開火時都會創建一個彈丸物體,並在撞擊時將其摧毀。每一幀所有主動投射物都會被檢查與其他物體的碰撞。 這兩個步驟似乎都可以肯定需要改進。有關如何有效處理這些對象的常見方法?遊戲中的武器類設計?

一般來說,我正在尋找關於如何做清潔和高性能的類設計的建議,到目前爲止,我的谷歌搜索技巧很弱。

我很樂意接受有關此主題的任何建議。

+0

一次只有1個彈丸嗎? – Orbit 2011-03-04 18:08:29

回答

3

我不認爲這是關於課堂設計。你的課程很好,這是需要工作的算法。

他們需要更新很多,銷燬/創建了很多,通常需要更新。

不要摧毀每一個子彈,可以考慮把它放入死亡子彈列表中。然後,當你需要創建一個新的對象時,而不是分配一個新的對象,從死亡列表中拉出一個並重新初始化它。這在保存內存管理調用時通常會更快。

至於更新,你需要更新一切變化 - 真的沒有辦法。

每一幀所有活動的投射物都會被檢查是否與其他物體發生碰撞。

首先 - 如果你檢查每一個對象,然後每對對象進行兩次比較。只需比較更新列表中稍後顯示的對象,即可獲得一半的檢查數量。

#Bad 
for obj1 in all_objects: 
    for obj2 in all_objects: 
     if obj1 hit obj2: 
      resolve_collision 

#Good 
for obj1 in all_objects: 
    for obj2 in all_objects_after_obj1: 
     if obj1 hit obj2: 
      resolve_collision 

如何實現「all_objects_after_obj1」是特定的語言,但如果你有一個數組或其他隨機存取結構牽着你的對象,你可以從1開始索引OBJ1後。

其次,命中檢查本身可能會很慢。當一個簡單的選項可以做時,確保你沒有執行復雜的數學來檢查碰撞。如果世界很大,一個空間數據庫方案可以提供幫助,例如。一個網格圖或四叉樹,以減少對象的數量來檢查潛在的碰撞。但在小型遊戲中,這往往是尷尬的,而且很少有收穫。

這兩個步驟似乎都可以肯定需要改進。

他們只'看起來'?剖析應用程序並查看緩慢部分的位置。猜測性能幾乎不是一個好主意,因爲現代語言和硬件可能令人驚訝。

5

當您在很短的時間內創建和銷燬大量對象時,常見的方法是將已分配的實例池重新初始化。只有在池爲空的情況下才會分配新的實例。 Apple使用MapKit和表格視圖等來實現這一點。學習這些接口可能會很好地爲您服務。

0

正如Jim寫的,你可以創建一個對象池並對其進行管理。如果你看到一個特定的設計模式,有Flyweight。希望它能幫助你。