2:虛幻引擎網絡架構:Replication

  虛幻引擎的網絡架構主要功能便是經過Replication Actor,Variable, function來保持服務器和客戶端的信息同步。Unreal的每個類都有一個複製語句Replication{}。這個塊中能夠進行變量和函數的複製。編程

這是在PlayerReplication中的複製語句服務器



  在上面代碼中:
-bNetDirty表示variable中有值發生了變化纔會進行復制。
-bNetInitial應該老是爲true。
-若是Actor的Owner是當前客戶端的PlayerController則爲true。

  上面的Replication模塊定義了這個Actor中能夠從服務器端發送給客戶端同步的數據,這樣能夠只挑選不多的一部分進行傳輸節省了大量的帶寬。還能夠把Network編程的部分從代碼中剝離出來看。



  1.變量複製
  通常是變量被服務器發送給客戶端,但也存在少數從客戶端將數據返給服務器端的狀況發生。對於從客戶端複製到服務器的狀況,這個操做必須是在客戶端的PlayerController中完成!
  變量複製老是在每次更新的最後執行,而且是Reliable。

  
  2.函數複製
  儘管在單人遊戲中將老是執行每個function,但在網絡遊戲中可不必定是。例如腳底下Buff粒子播放的函數能夠只須要給本身看見,而其餘玩家不須要看到。由於函數複製和變量賦值前後順序的問題,你得考慮複製的函數中包含那個要被複制的變量改變,能夠將其當作這個函數的參數一併複製哦。
  函數複製能夠有Unreliable,


  3.仿真

  在服務器上每個函數都會被執行,除非是從客戶端發送來的。在客戶端上,每個函數都有一個起源,要麼是從服務器 到 客戶端的複製函數,事件函數或exec 函數。
  對於Simulated函數,是爲了給客戶端支持接近Actor實際運行效果的函數,同時被Server和Client調用。考慮到一個Projectile撞擊牆壁,這個函數可被設爲Simulated,由於Client能夠預測這個事件的發生。這會減小沒必要要的從服務器複製給客戶端的網絡傳輸延遲。大多的PostBeginPlay也是這個狀況,在客戶端的Actor會初始化料理好本身。

 

 關於優化和提升性能: 對於網絡設計,咱們老是想覺得玩家提升低延遲的遊戲服務爲宗旨的,因此在作網絡編程時應該注意一下幾個原則和內容:  - 最少化複製Actors的數量  - 最小化每次Actors在tick時的更新:將Relevancy的Actor數量儘可能降到最低(下節講Relevancy)  - 避免沒必要要的bNetDirty  - 避免沒必要要在服務器端的Actor Spawn,例如爆血粒子,讓服務器端的玩家看到便可。  - 避免一些遊戲性不相關的Relevancy,(好吧,這裏仍是講Relevancy,就是說有時候一些Actor離你很遠不會處於攝像機內,並影響到你。這時候你就不須要給這些Actor進行網絡同步耗費帶寬)  - exec function的數量儘量降到最低  - 總之保持如下原則:1.保持每個Client的Relevant Acto數量最小  - 減小每次更新的屬性數量  - 減小傳輸包的數量  解壓DevNetTraffic查看全部複製Actor的屬性記錄。Stat Net來查看對應的網絡情況信息。   Replication { //服務器應該發送到客戶斷的數據。 if ( bNetDirty && ( Role == Role_Authority ) ) Score, Deaths, bHasFlag, PlayerLocationHint, PlayerName, Team, TeamID, bIsFemale, bAdmin, bIsSpectator, bOnlySpectator, bWaitingPlayer, bReadyToPlay, StartTime, bOutOfLives, UniqueId; if ( bNetDirty && ( Role == Role_Authority ) && !bNetOwner ) PacketLoss, Ping; if ( bNetInitial && ( Role == Role_Authority ) ) PlayerID, bBot; }
相關文章
相關標籤/搜索