2011-02-11 13 views
13

我正在設計一個小型足球遊戲,其中游戲引擎(計算玩家移動等)在服務器上運行,渲染和鍵盤/鼠標處理由客戶端完成。對於服務器(哈斯克爾)我想用如何在Haskell中最好地同步遊戲引擎和網絡服務器?

  • Happstack客戶端 - 服務器通信
  • 揚帕/ Reactimate的遊戲引擎

每20ms左右,客戶端應該發送的鍵盤和鼠標事件通過HTTP GET發送到服務器,接收當前的遊戲狀態(JSON編碼的球和玩家位置)並渲染它。我正在考慮在遊戲循環,輸入處理和渲染中使用SDL基礎架構。

服務器基本上運行兩個線程:happstack服務器接收HTTP GET,將鍵盤/鼠標命令放入隊列中,從第二個隊列中讀取當前的遊戲狀態並應答HTTP GET請求。

第二個線程運行Yampa遊戲引擎,如Yampa Arcade paper中所述:遊戲引擎儘可能快地計算新一輪(無滴答)並將結果放入渲染隊列中。

Architecture

普遍質疑:這是否看起來像一個可行的架構?

具體問題:如何設計服務器端渲染隊列:是否會爲此使用Chan?如果遊戲引擎的平均速度比客戶端的「滴答」速度快,那麼隊列會變得越來越長。這怎麼可能與Chan處理?

您的建議非常受歡迎!

回答

6

你能解釋一下游戲本身嗎?當我想到足球比賽時,我想到的是需要實時反饋的遊戲,其中輸入應該立即處理,我希望玩家輸入信息能夠立即通過網絡發送。 20ms的延遲時間相當長,我相信當玩家按住鍵試圖移動他/她的角色時,它可能會引人注意,它可能會感到生澀,因爲某些類型的垃圾收集器經歷過這種干擾。

我也不明白你爲什麼想要爲這樣的遊戲(任何遊戲)使用HTTP,幾乎所有的遊戲都使用UDP,我可能會沿着這條路線走你的遊戲類型。 This tutorial對於學習這種東西看起來很棒。

我也會質疑你對網絡數據格式的選擇,你爲什麼要在接收/發送時需要非平凡解析/格式化的格式?我想可能會發送大量數據,而且經常會增加大量時間。如果我要使用字符串,我會嘗試使用最簡單的格式,這需要非常少的解析。在我將要工作的相關係統上是一個使用套接字進行通信的多進程實時系統,最初它使用xml字符串作爲網絡數據格式,而且效率非常低,而且所有進程都在同一臺機器上。

關於揚帕&服務器端渲染,所以如果我們在遊戲方面認爲FRP作爲執行遊戲邏輯&實體的手段,我相信大多數網絡遊戲對服務器的客戶端&實體。通常可渲染的對象是客戶端實體,不可渲染的是服務器實體,我猜一些實體在兩者上都有表示。所以在這種情況下,你可能想讓Yampa在服務器端&上運行,我會盡量避免與服務器端渲染相關的任何事情。可以接受的對象應該主要堅持我相信的客戶端。是否有一個特定的原因,爲什麼你想要從服務器渲染命令?

+0

非常感謝,只是我一直在尋找的輸入!至於服務器端渲染:我想讓遊戲引擎計算玩家和球位置(只有X,Y,Z座標),並將它們通過渲染隊列和HTTP發送到客戶端。我仍然需要通過你的鏈接工作,但它已經在我看來像這是已經走過的死路... – martingw 2011-02-12 11:02:47

2

如果你有興趣,我也寫過類似的服務器 - 客戶端曾經在Haskell舉辦過一場基於足球的足球比賽您可以在githubserverclient)找到源代碼。由於當時我還是一名Haskell初學者,因此我遇到了有關線程的一些問題(和blogged about them),並且從未真正完成過該項目,但您至少可以從代碼中看到如何不執行該操作。 (最後我放棄了服務器 - 客戶端架構,並寫道freekick2。)但我確實認爲架構本身是可行的。

但是,像snk_kid寫道,我不知道你爲什麼要使用HTTP。要讓它在沒有(明顯)延遲的情況下通過網絡運行,您可能不得不使用UDP以及客戶端預測(一些信息性的材料)。

+0

謝謝,安蒂!我會看看你的代碼!我想我也會跳過CS部分,這個UDP擺弄似乎很複雜...... – martingw 2011-02-21 13:25:04