2012-04-29 61 views
10

我只想着厄爾爲遊戲服務器的可能性。 (哦,我不是Erlang專家,只是考慮舞臺)這意味着使用演員模型進行遊戲模擬。當然,最大的吸引力是它的併發分佈在多個節點上。演員模型和碰撞檢測

我目前的一個巨大問題是我應該如何執行多角色交互,如碰撞檢測。 (這只是一個例子)

雖然碰撞檢測本質上需要在任何比賽,但在角色模型的性質,它看起來並不有效,甚至是沒有意義的,因爲它需要全球同步狀態查詢並更新所有的目標參與者。如果我使用任何同步,它將覆蓋Erlang的actor模型的所有優點。

當然,如果我正確地使用空間分區,一次只能針對參與者,但這只是一種優化,而不是一個主要的答案。或者這是這個問題的正確答案?通過減少互動角色的數量來減少同步的範圍?

回答

9

將地圖拆分爲較小的部分,並讓每個部分成爲其自己的過程(甚至可以將其分開以至於每個瓦片都是自己的過程)。試圖移動的玩家會發送一條消息給該地圖/子地圖,表示該地圖正在進入該地圖,如果該地圖沒有問題,該地圖會進行回覆。這避免了衝突,因爲一次只有一個消息由瓦片/子地圖處理。多個子貼圖/貼圖可能會同時處理消息,因此它仍然是一個併發程序。

+0

交互作用範圍的縮小是唯一的選擇。謝謝。 – Eonil 2012-05-01 03:59:15

7

我有一個在Erlang做服務器的天基遊戲。訣竅是每個位置/節點/ etc都是演員。它不斷運行物理並定期將信息發送給每個遊戲實體演員。

當你更加抽象地思考演員/實體是什麼時,整個事情變得更加清潔。例如,碰撞可以是完整的演員。這使得客戶端變得更加容易 - 將圖形和聲音效果與碰撞聯繫起來。在服務器端,它也可以 - 在給定時間內多次避免兩個實體之間的多重碰撞效應。

+0

那麼所有在單人演員中完成的物理?你是如何完成物理學的? – Eonil 2012-05-01 03:56:23

+2

是的。我使用Bullet來運行物理。實體演員跟蹤他們自己的遊戲狀態,相互射擊,決定運動等。他們發送命令到運行模擬的位置。該位置連續運行並定期向實體發送「您在此處」,並且「您與X發生了碰撞」。實體也將查詢發送到該位置。 – Nialscorva 2012-05-01 23:56:23