2010-12-23 166 views
2

我想寫一個類似於說Go的多人遊戲,並想知道人們如何在服務器端跨玩家進行通信?設計問題服務器端編程在php

由於php(或任何其他語言)沒有任何內容可以做到這一點,所以我可以將每個動作都寫入數據庫並讀取給其他玩家。但這看起來很浪費,原因如下 -

  • 我不需要存儲各種玩家的動作。 (除非你說服我,這是絕對必要的)
  • 該數據庫將被寫入重量以及讀取重量(很多資源我可以用於其他)
  • 它現在可以將內存存儲在內存中。我正在尋找快速原型。 (據我所知,如果我將東西存儲在內存中,那麼如果機器即時死機,我將失去所有用戶的整個遊戲)。

因此,儘管它有一個不同的用例,瀏覽器中的聊天應用程序有什麼作用?對於我來說,寫一個數據庫是一個明確的例子,因爲它的遊戲可能會持續10-15分鐘,但對於一個絕對不需要的聊天來說。

我應該知道的任何其他軟件?我可以使用XMPP服務器嗎(還沒有看過這個),但是它能用普通的標準HTTP post/get嗎?

指向我一些網址,我會從那裏進行研究。謝謝你的幫助。

  • 帕烏
+0

xmpp可能會有點矯枉過正,最終你將不得不使用某種基於服務器的存儲,無論是mysql,一些nosql數據庫還是一個平面文件 – Hannes 2010-12-23 16:03:29

+0

COMET它你正在尋找的神奇詞 – 2010-12-23 20:11:46

回答

0

我用Memcached來做這種事情。速度非常快,並沒有存儲所有的動作(只是覆蓋了玩家的鍵)。它會讓你的事情變得更加美好和容易。

PECL中有兩個PHP Memcached庫(MemecacheMemcached)。這兩項工作都很好。

0

許多聊天使用扁平文件。平面文件也許是您的正確選擇。正如可能對Memcached的一些非正統用法一樣。遊戲本質上是短暫的。因此,對於Session來說,做同樣的事情可能是模式化系統的好方法。

祝你好運!

+0

Flat文件是我猜的一種方式。我也在想Memcached,但是擔心在研究上花費太多的工程時間(儘管我喜歡它)。我想檢查一下我是不是錯過了一些其他遊戲開發者已經使用的軟件。 – user220201 2010-12-23 16:27:15

+0

不是真的...... PHP中的遊戲服務器並不完全是一個標準。遊戲需要持久性,而php不這麼做。 – DampeS8N 2010-12-23 16:32:52

0

我從來沒有聽說過那個遊戲,但是比如像Ogame這樣的網頁遊戲使用數據庫來存儲動作和東西。其他人使用平面文件,但這對我來說似乎並不好,因爲我聽到很多關於安全問題的信息。可以肯定的是,一個設計良好的數據庫應用程序比任何其他工具都要安全得多。真正的問題是另一個:PHP不是爲遊戲而製作的,可能永遠不會。

0

如果HTML 5已啓動並正在運行,那麼您希望使用套接字連接到您的服務器(您目前可以使用Flash來執行此操作)。基本上,您將始終在服務器上運行一個守護進程腳本,它將監聽某個套接字,並保留已連接用戶的列表,然後當某個連接的用戶將消息發送到套接字服務器時,套接字服務器將解析消息,並將其轉發給正確的連接用戶。這種方式不需要太大的存儲空間。它會收到並立即發回消息。

客戶端基本上會創建一個持久連接到套接字服務器,並有一個處理程序來接收服務器守護程序發回的消息。服務器守護進程可以通過命令行運行PHP(所以它始終運行並且不會超時)。您將需要爲啓動時運行PHP守護程序腳本的服務器創建一個init shell腳本。您還需要訪問PHP腳本中的套接字(這在大多數共享服務器上是不允許的),這意味着您可能需要一個VPS(虛擬專用服務器)。

這是這種東西HTML5會給我們帶來對的,但你最好的,但現在正在使用Flash,而不是(或使用的低效率的方法,是不是真正的異步之一)。這是一個很大的主題,所以我不能詳細說明,但我至少可以指出你的方向。互聯網上可能有這樣的例子。

1

我主張XMPP相當多,因爲它解決了大部分的問題給你。大多數的XMPP服務器都支持通過HTTP連接(通過被稱爲BOSH彗星狀技術),存在至少兩個純JavaScript庫,其允許直接從瀏覽器:Strophe.jsJSJaC

通常因爲短的路由的XMPP服務器僅將消息保存在內存中,因此不會將它們寫入數據庫。大多數服務器都支持插件,以便將系統更改爲記錄移動或將消息透明存儲到數據庫稍後可能會發生。

其中一位Strophe.js作者寫了一本關於編寫一個簡單的雙人遊戲(實際上是Tic-Tac-Toe)的章節,所以如果沿着這條路線走,你可能需要check that out