我正在嘗試爲實時3D遊戲創建一個C++插件。雖然我相信對UDP理論有一個牢固的把握,它是如何工作的,它的優點和缺點是什麼,我關心的主要問題是性能,可伸縮性和可能的統計數據。我知道,我只知道在涉及UDP甚至TCP的情況下,海洋價值的下降。多人UDP網絡策略,需要建議
問題:
給定一個某些情況下,很多球員會怎麼一個典型的專用服務器(一個或多個)能夠在任何一個時間來應對。
現在的情形...
讓我們想象一下,我們有一個MMORPG遊戲,所有玩家都可以在「遊戲世界」的任何地方。每個人都可以向同一個服務器/服務器中心發送和接收數據,因爲每個人都必須能夠......看到每個人,並在其路徑最終跨越時與其互動。這是一款真正的第一人稱遊戲,所以玩家的位置必須非常及時。
比方說我們有1000個(甚至10000)在線玩家...
三個主要的事情需要在這裏發生:
每個玩家通過UDP的數據流發送到遊戲服務器,比如說每秒發送14次。簡而言之,這些數據包括誰,誰在哪裏以及每個玩家是什麼。正在發送的數據已經規格化並針對大小和速度進行了優化,以鼓勵最小的帶寬使用。
服務器例如每秒接收14次這些數據包,因此每秒鐘處理14 000個數據包,例如達到1000個(用於示範目的的非虛構數字)。該處理階段通常涉及更新中央存儲器數據結構,其中玩家舊的x,y,z位置數據將用他的新位置和時間戳更新。服務器上的這個數據結構包含整個遊戲世界中所有玩家的所有數據。
服務器(可能是一個單獨的線程,甚至可能是一臺獨立的機器)現在需要將數據包廣播給所有其他玩家,以便他們可以更新屏幕以顯示地圖上的其他玩家。這也是每秒發生14次。 (其中14個可能通常是一個動態數字,根據所使用的CPU容量而變化,繁忙的CPU,較低的幀率,反之亦然)。
重要的是:對於玩家X,只有他職位視覺範圍內的其他玩家的數據被分派給相應的玩家。因此,如果玩家Y距離2英里,他的數據需要發送給X,但是如果玩家Z位於地球的另一側,他的數據不會被分派到X以節省帶寬。這當然涉及更多的處理,因爲數據必須使用最有效的索引解決方案進行迭代和過濾。
現在我擔心的是,從客戶端發送數據包到服務器RAM中,稍微處理更新數據並選擇性地向其他播放器播放信息需要時間。這意味着服務器將能夠處理的某個閾值,是的,取決於我的實現的有效性,所使用硬件的速度和能力,當然還有其他外部因素,例如網速,交通和nr。太陽耀斑每秒擊中地球......只是在開玩笑。
我正試圖從別人身上找出來,他們已經經歷了這個過程,陷阱是什麼,以及創建多人插件時可以期待的典型性能。
我可以很容易地說:「我想要滿足10000人同時在同一臺服務器上玩遊戲」,你可能會說:「每臺服務器上100個是更現實可能的數字。」
所以我知道我可能不得不想出一個多服務器/雲計算中心來處理我的數千個請求和調度,將處理負載分配到多臺機器上。所以我可能有幾臺機器只處理接收數據,一個巨大的中央盒子,就像所有接收和發送機器共享內存數據庫,然後是一系列調度機器。
顯然,有技術限制,我真的不知道會發生什麼,以及它們是什麼。並且在問題中拋出額外的CPU和服務器箱將不會永久解決問題,因爲機器之間的更多的互相通信也會降低該過程的速度。我猜想你投入的CPU越多,可能會降低效率,甚至會在某個閾值下逆轉CPU生產力。
可以,我應該考慮P2P(點對點)多人遊戲!
我是否現實地說,我可以在任何時候爲2500名玩家提供服務?
在幾年的時間內可以擴展到10000個玩家嗎?
我知道這個問題太可怕了,所以請接受我真誠的道歉。
但是,如果服務器不處理任何播放器到播放器,而只是更新和轉發,它應該是一個基本的O(n)過程。每個客戶端應該處理整個O(n^2)問題的單個O(n)切片。 – 2009-11-02 15:38:56
是的。但問題是,你正在看一個具有未指定常量的O(n)問題,問題正是關於那個常量(!) – MSalters 2009-11-02 15:46:54