終於有時間了,打算在這個週末認認真真的研究虛幻引擎網絡架構,同時我在Safaribooksonline上面發現了一本能讓個人生活變得輕鬆的書Multiplayer Game Programming by Rough Cuts,這個週末好好享用喲。服務器
好了,承接上一次的內容:爲何虛幻引擎的網絡架構這麼的高效?網絡
1.從他的架構模式繼續廣義的客戶端-服務器模型(Generalized Client-Server model):架構
在這個模型中服務器仍是控制着遊戲狀態的變化,客戶端運行着和服務器同樣的代碼判斷遊戲的運行狀態。服務器經過複製replication的方式將遊戲狀態信息發送到客戶端,客戶端和服務器也能夠replication交換信息。函數
固然爲了最小化的複製內容,咱們分類出了僅有調用函數的Actors。性能
2.從最先Tim Sweeney闡明的虛幻網絡架構,Unreal 3- Unreal 4我並未發現有太大的變化。動畫
在引擎中一般能夠有如下內容能夠進行復制Variable, Function ,Actor,Object, game state, tick。this
-Client 是一個Unreal.exe的運行實例,維持着一組和世界中發生事件的近似遊戲狀態子集,而且能夠渲染世界的近似視圖。代理
- Server是一個正在運行的實例,負責每個獨立關卡並把遊戲狀態傳給客戶端。code
3.Unreal發生在Server和Client之間的更新循環對象
- 若是我是Server,我能夠將本身的狀態傳給全部的客戶端。
-若是我是Client,我能夠把我請求的運動發送給服務器,並從服務器收到遊戲狀態信息,發送到客戶端上渲染到屏幕上。
4.關於虛幻中的實時狀態更新:event Tick(float DeltaTime)
每次Tick影響到遊戲全部Actors的更新,實現了他們的物理等變量或事件,例如Position+=velocity*DeltaTime;
所以在Tick對於做用於Actor能夠
- 修改Actor的變量
- 建立Actor
- 銷燬Actor
你會好奇我爲何花費那麼多能量來闡述虛幻中的更新呢?由於服務器管理遊戲狀態就是在管理世界中的全部Actors的狀態。所以服務器被看作是一個真正的遊戲狀態,客戶端上的遊戲狀態能夠說是服務器端的近似狀態,須要被督導和斧正。存在於客戶端的對象,不能被看成代理,由於他們只是一個代理的近似。
例如你的iPhone機器上跑了本身的角色Pawn,那其實不是真正的Pawn,而是一個向服務器端的Pawn的Clone,僅爲你呈現而已。悲哀吧,你只能在客戶端玩到一個阿凡達。
5.爲了節省性能,咱們得對Actor進行一些分類:這些標誌能夠代表這個Actor的那些環節將會被replication
在一個關卡中,有一些Actor的狀態不會產生什麼變化,咱們知道他們是一成不變的,因此複製沒有意義只會浪費沒必要要的帶寬和浪費。咱們使用兩種標誌位將bNoDelete || bStatic 的Actor進行排除,這兩種標誌位的Actor通常或是StaticMesh等或者GameInfo。
那麼Actor爲了進行replication還須要進行哪些特殊的標註呢?
在服務器和客戶端都存在的Actor咱們標註其爲Authority。對於服務器端是一直都會保存其爲Authority權威,而對於客戶端是進行優先級進行區分的:例如在網絡複製中同步到客戶端,若是一個濺血粒子效果的表現的重要性,確定不及玩家射出的子彈。根據優先級咱們能夠分爲:
DumbProxy(啞代理):傳送門,拾取物品
SimulatedProxy(仿真代理):射彈等可使用物理在客戶端進行預測的Actor。說明這是個臨時Actor,在客戶端模擬物理和動畫。
AutonomousProxy(自治代理) :說明這是一個本地玩家,能夠進行一些本地預測運動(給予玩家控制)。能夠執行本地腳本,只可在本地客戶端可見,不會在服務器和單人玩家遊戲中見到。
Authority:能夠執行腳本,進入狀態,全部在服務器端的Actor。當在本地,這個Actor只在本地生成以便減小帶寬,例如特效。 在服務器端,全部Role=ROLE_Authority和RemoteRole設置成同一種代理類型。在客戶端和服務器端是相反的。
// Net variables. enum ENetRole { ROLE_None, // No role at all. ROLE_SimulatedProxy, // Locally simulated proxy of this actor. ROLE_AutonomousProxy, // Locally autonomous proxy of this actor. ROLE_Authority, // Authoritative control over the actor. }; var ENetRole RemoteRole, Role;
用如下的舉例來結束這一片內容:
a.由於Actor.AmbientSound變量是從服務器發送給客戶端的
if(Role==Role_Authority)
AmbientSound;
b.Actor.AnimSequence,只有當actor被渲染成爲mesh時纔會從服務器發送給客戶端
if(DrawType==DT_Mesh && RemoteRole<ROLE_SimulatedProxy) AnimSequence;c.Server傳送給client velocity爲代理模擬。當被初始化爲mover時 if((RemovetRole==ROLE_SimulatedProxy && (bNetInitial||bSimulatedPawn))||bIsMover)velocity;