2008-09-26 57 views
11

我對「過山車大亨」和「模擬人生」以及FPS遊戲等應用程序的表現非常着迷。我想了解更多關於基本應用程序體系結構的信息。 (不太關心用戶界面 - 我假設MVC/MVP piriciples在這裏適用,我也不關心數學和物理在這一點上。)如何設計真實世界的模擬?

我的主要問題涉及模擬中的數十或數百個單獨的對象(人員,車輛,物品等),所有這些都會移動,做出決定並提高對事件的響應 - 看起來都是同一時間,以及它們如何設計以實現如此出色的性能。

問:主要是,這些對象是在一個巨大的循環中處理,一次一個 - 或者是每個對象都在它自己的線程中處理?在這樣的模擬中有多少線程可行? (當然球場數字,10,100,1000)

我不想寫一個遊戲,我只是想設計理論,因爲我想知道這樣的設計是否可以適用於其他應用程序,其中幾個決定是看起來在同一時間。

回答

8

做這種模擬有兩種基本方法Agent BasedSystem Dynamics。在和基於代理的模擬中,遊戲中的每個實體都將由具有屬性和行爲的類的實例表示,實體之間的所有交互都必須被明確定義,並且當你希望這些實體交互時,函數被稱爲屬性交互實體的變化。

系統動力學是完全不同的,它只處理總和和總數,系統中沒有單個實體的表示。最簡單的例子就是捕食者和獵物模型。

這兩種方法都有優點和缺點,系統動力學方法可以更好地適應大量的實體,同時保持運行時間短。雖然有多個公式需要計算,但計算時間與公式中的值無關。但是在這種方法中沒有辦法看到個體實體。基於代理的方法可讓您將實體放置在特定位置,並允許您與模擬中的特定實體進行交互。

FSM和Celular automata是如何在遊戲中模擬系統的其他方法。例如。在基於代理的方法中,您可以使用FSM對一個代理的行爲進行建模。 Simcity使用Celular自動機來做一些模擬工作。

一般而言,您可能沒有一個龐大的模型,只能執行特定任務的多個系統,其中一些模型不需要經常更新,例如決定天氣的東西,其他人可能需要不斷更新。即使你把它們放在不同的線程中,你也可以在需要時暫停或啓動它們。您可能希望將工作分成多個框架,例如只計算一定數量的代理的更新。

1

直到最近,遊戲的邏輯和管理都是在大型有限狀態機的單線程中。不過,現在,你傾向於將線程中的不同部分(音頻,圖形,物理,'模擬'邏輯等)分解爲它們自己的FSM。

編輯:順便說一句,線程是一個非常糟糕的方式,讓模擬中的事物在'同一時間'發生 - 它會導致競爭條件。通常情況下,當您想要在「同一時間」進行某些操作時,只需在迭代數據並單獨存儲數據時就能確定需要執行的操作,然後在處理完所有數據後再應用它。 Rince,重複一遍。

+0

每個對象都可以在自己的線程中同時設置其狀態(屬性),然後讓主進程處理結果。沒有事件或比賽。但是,循環不會等待每個對象處理......? – 2008-09-26 04:26:55

+1

你可以通過線程池或其他相當有效的方法來做到這一點,但我發現最好將數據分成塊,然後爲此處理處理程序,建立一個像我描述的變更集。 – 2008-09-26 04:36:57

+0

完全不同意你的答案。如果它像「不同線程上的一個胖FSM」那麼簡單,那麼每個人都會發布這樣的遊戲。除了這個過於簡單的迴應之外,還有更多。你有沒有曾經在一個嚴肅的遊戲標題之前? – 2008-09-26 09:22:22

0

@Cody Brocious

CodeProject使用LINQ來證明這種做法。 (Linq to Life)

+0

我已經添加了一個有關這種方法如何不可擴展的評論,在我意識到這只是它的實現之前 - 該死的我對LINQ理解的缺乏;)良好的鏈接。 – 2008-09-26 04:39:21

0

除了發佈的建議,我建議在sourceforge瀏覽模擬標籤。有各種不同複雜程度的仿真項目。

Sourceforge

此外,我提出以下建議書的基本概況,雖然它是專注於物理它模擬的問題涉及。

Physics for Game Developers

4

的源代碼到原始模擬城市已經開來源爲Micropolis。這可能是一個有趣的研究。