2010-02-12 66 views
1

現在我正在嘗試爲iPhone製作mmorpg。我已經設置好了,以便iPhone每秒要求玩家位置數次。它是如何實現的,客戶端使用異步NSURLConnection將請求發送到一個php頁面,該頁面從mysql數據庫加載位置並將其返回給json。但是,從請求位置到實際加載時間大約需要0.5秒。這似乎真的很高,有沒有任何明顯的事情可能導致這種情況?iPhone中的高延遲mmorpg

此外,這也會導致玩家在客戶端上的移動也會非常波動。有沒有任何算法或方法可以減少玩家運動的不穩定性?

+0

正如人們所說,你的解決方案在每一步都很慢。即使使用開放的TCP連接和優化的協議,查詢也需要至少300 ms才能通過3G連接到您的服務器。即使這不是問題,您從數據庫中加載狀態的設計聽起來非常令人擔憂。 – Nuoji 2013-07-27 13:54:12

回答

4

開始測量數據庫查詢在iPhone外部運行時需要多長時間。

然後測量當您從iPhone以外的東西發送相同的http請求(例如10-15行c#程序來解決這個問題)需要多長時間。

如果以上都不顯示任何類型的顯着延遲,則需要在iPhone端完成改進。有些事情看出來的:

  • GPRS/3G具有相當高的延遲
  • GPRS/3G具有相當高的誤碼率 - 這意味着有將是不少丟棄的數據包,然後現在這將導致TCP重傳,您將遇到更高的延遲
  • HTTP有很多開銷。
  • JSON增加了很多開銷。

    也許你需要拿出你的消息的緊湊二進制格式,並支持自定義協議的下降HTTP - 甚至恢復到UDP

以上幾點一般不但如果您需要在高延遲,低帶寬,片狀連接方面提供流暢的體驗,則可以應用。

  • 至少,請確保您沒有爲每個請求設置新的TCP連接。你需要使用http keep-alive。

我沒有關於玩家移動算法的任何具體信息,但是經常使用的是某種移動預測。

你知道玩家正在移動的方向,如果它不總是恆定的,你可以得出速度 - 這意味着你可以插入一段時間,猜測他的新位置,調整屏幕上的位置,而你正在查詢的實際位置,並在獲得查詢響應時調整回實際位置。訣竅是始終在特定邊界內隨時間進行插值。如果您的預測與查詢返回的內容相比有點偏離,請不要立即將該位置重新放回到真實位置。在當前位置和所需位置之間插入幾幀。

+0

當然忘了HTTP!你應該更多地探索流媒體應用的方向,iOS有很酷的功能 – 2012-04-16 13:40:18

3

在服務器端,您應該使用一些可以保持運行並始終保持數據庫連接處於打開狀態的系統。最好它也會緩存一些東西,而不是始終從數據庫請求它們。

此外,不要爲每個更新都創建一個新的HTTP請求。如果你根本不需要使用HTTP,那將是最好的,因爲它確實不適合實時通信。

GPRS的ping通時間通常爲600ms,3G有300ms,HSPA有100ms。查看正在使用哪種模式。請注意,有些設備(我不知道iPhone)從HSPA降至常規3G,以便在沒有足夠的流量來證明更快的模式時節約電力。

至於位置,相當普遍的做法是應用線性預測,即使當前速度下字符繼續沿當前方向移動,即使當沒有來自服務器的數據可用時。

最重要的是:基準/配置文件以查看延遲時間。它是你的服務器,網絡連接還是應用程序。

1

加載玩家位置快速下降。

  • 它錘擊您的服務器。
  • 3G是不是真的意味着支持低延遲應用

所以我沒有看到一個MMORPG沒有一些必要的相關操作,此時,如根據它們的速度和位置推斷路徑。加載位置不會像你想要的那樣快,特別是在基於PHP的服務器上。

無論哪種方式,在爲移動平臺開發時,您將不得不在功能方面與功能齊全的桌面實現方面做出犧牲。

我也可能會重新實現一些更關鍵的東西,如果不是整個服務器以更快的語言,例如C++。