2009-12-31 261 views
1

我主要在尋找安裝建議和如何去做這件事的指針。我會盡可能詳細地解釋我所能想到的,並注意可能的方法。實時瀏覽器遊戲服務器

這樣做的目的是創建一個實時瀏覽器遊戲,我發現我的需求的最佳方法是使用ajax的「長輪詢」,它基本上會設置一個請求,那裏「直到服務器有東西發送它,然後重新建立連接時收到更多的數據。爲了我的目的,這將處理聊天系統和角色移動,IE:如果玩家進入同一區域,那麼客戶端會收到響應通知他們,從而更新瀏覽器客戶端以顯示此信息。

上面是相對容易實現,我已經爲它做了一個測試用例,但是我想改進它,在服務器端運行一個循環X時間,然後它會自動超時併發回空字符串,這樣就可以建立另一個連接,這是爲了防止無限循環,並在不應該使用資源的情況下使用資源。對於需要發送給客戶端的消息,我使用平面文件,而不是在每個循環週期中查找數據庫(相當昂貴,我相信),如果文件的修改時間戳大於發送給客戶端的最後一個消息,那麼存在一些新的發送。不過,我相信這樣做也會很昂貴(而不是像使用mysql數據庫那麼多),每秒完成幾次。我的思考過程就是讓一個C++程序(爲了速度)不斷運行,並用它來快速查找內存中的新消息,所以第四,這也會給我額外的好處,在服務器可以控制更實時的感覺/方法的遊戲中有機器人,但是我不知道如果這甚至是可能的,並且我在谷歌上的搜索沒有結果。

我最希望能夠做的方法是繼續使用PHP來執行頁面的呈現和控制等,並將ajax請求發送到C++應用程序(它將始終運行)可以處理所有的實時問題。

CGI打破了上述方法的目的,因爲它在每個請求上創建了一個新的應用程序實例,這既慢又正是我不想要的,我爲此擁有了PHP,並且不想切換一個完美的語言可以更好地適應另一個語言,然而PHP(據我所知)不能將內容存儲在內存中(RAM)等等。

我想過的另一種方法是使用php套接字連接到C++應用程序,但我不知道這可能是多麼可行。 C++應用程序基本上只需要控制機器人(AI)和聊天系統消息。我完全不知道如何去處理通過PHP的機器人。

我希望這可以完全解釋我的意圖和目標,所以如果任何人有任何指示或建議,請回復並幫助我,這將非常感激。如果您需要任何額外的信息(因爲如果我沒有很好地涵蓋某些東西或某些東西),那麼我會很樂意嘗試更好地解釋。

回答

2

反應需要多快?對於接近實時動作遊戲的任何事情,AJAX/Comet將會變得太慢。開銷也非常令人沮喪。

這種事情的前進方向可能是WebSocket,後端有一個自定義服務器。但我不認爲這意味着你需要訴諸C [++];瓶頸最有可能是網絡而不是服務器處理器的能力。我正在使用Python SocketServer與一個微不足道的消息複製系統 - 在我的情況下,所有的遊戲邏輯都在客戶端,一些複雜的JavaScript在面對滯後時保持一致的遊戲世界 - 但即使是一個更復雜的服務器端,我認爲腳本語言可能會很好。

WebSocket尚未準備好;沒有主流的瀏覽器實現。與此同時,我使用模擬WebSocket接口的Flash Socket備份。閃存套接字有它們自己的問題,因爲它們無法協商代理,但它們速度很快,希望在WebSocket正確到達時它們的需求將會減少。

+0

我看着彗星,並認爲它們太有限制,我已經看到了一個名爲Travians的RPG遊戲(它連接到端口8010上的IP地址)的長輪詢工作。 腳本語言的問題在於它不是持久的(我相信這是正確的詞彙?爲了闡述它不是一直運行,所以處理bot狀態會是一個問題?) 爲了進一步解釋travians方法,他們的長輪詢收到一個命令字符串,客戶端上的JS進一步處理,例如它會收到「MoveChar Steve 2009-12-31 05:03:11

+0

腳本語言可以以持久的方式使用,而不僅僅用作Web服務器後端。這就是我用Python做的事情,你可以用任何腳本語言來做(甚至PHP,儘管它不是特別合適)。我也在每行使用一個命令字符串,但在我的情況下,它們是像'.1 f'這樣的低級命令(在遊戲幀15處按下左鍵)。 – bobince 2009-12-31 13:14:48

+0

我沒有python的經驗,這就是爲什麼我最初選擇C++的那個領域,我將不得不去使用php套接字並連接到每個ajax請求上的C++應用程序? – Steve 2009-12-31 15:48:02

2

讀你的帖子設置警鐘響鈴。

您對多線程代碼的熟悉程度如何?用C++?如果答案是「不太」,那麼我擔心你可能會咬掉一大塊。爲什麼不利用一些現有的(久經考驗的)COMET服務器實現而不是這種準系統方法?無論您想要什麼應用程序,它都應該與通信實現完全分離。

作爲一個已經實現了這樣一個服務器的人,我可以告訴你,這將需要很多設計迭代和很長時間才能得到正確的結果。現實地測試這樣的產品也是一個非常棘手的過程。

+0

我真的沒有看到需要完全多線程,其原因是我對MUD遊戲的經驗(玩家將通過telnet連接到這些遊戲),服務器不是多線程的(只有DNS查找),我認爲玩家在我們自己的線程中將會過度殺傷,並且阻礙性能超過收益,因爲bobince(下文)提到我的主要瓶頸將是網絡。 – Steve 2009-12-31 04:55:44

+0

如果你打算用C++編寫遊戲服務器,因爲它速度很快,那麼你最好熟悉多線程/併發處理網絡IO方面的事情。將存在共享狀態,很可能在由驅動網絡IO驅動的不可預知時間訪問。一個非線程的方法會很糟糕。我不是主張每個線程的玩家,但IO同時發生的事實是不可避免的,如果速度很重要,就需要解決。 – spender 2009-12-31 05:11:54

+0

您可以完美地完成異步IO而無需線程。無論是最合適還是最簡單的編碼方式都是有爭議的,但是有主要的網絡框架和服務器採用這種方法。 – bobince 2009-12-31 13:18:27