一、優先級
每個 Actor 都有一個名為 NetPriority 的浮點變量。這個變量的數值越大,Actor 相對於其他“同伴”的帶寬就越多。和優先級為 1.0 的 Actor 相比,優先級是 2.0 的 Actor 可以得到兩倍的更新頻度。唯一影響優先順序的就是它們的比值;所以很顯然,您無法通過提高所有優先級的數值來增加虛幻引擎的 網絡性能。下面是我們在性能調整中分配的部分 NetPriority 值:
-
Actor = 1.0
-
Matinee = 2.7
-
Pawn = 3.0
-
PlayerController = 3.0
計算 Actor 的當前優先級時使用了虛擬函數 AActor::GetNetPriority()。為避免出現飢荒(starvation),AActor::GetNetPriority()
使用 Actor 上次復制后經過的時間 去乘以 NetPriority。同時,GetNetPriority
函數還考慮了 Actor 與觀察者的相對位置以及兩者之間的距離。
二、相關性
場景的規模可能非常大,在特定時刻某個玩家只能看到關卡中的一小部分 Actor,作為玩家並不能看到場景中所有的玩家,只能看到自己周圍的一部分玩家,對於距離當前玩家比較遠的玩家,引擎會認為是不重要的,因此引入了相關性的概念。
也就是說,在當前玩家周圍的所有Actor是跟這個玩家相關的,可以設置一個距離,在這個距離范圍之內的所有Actor的更新都會通知到當前玩家。
任何一個Actor都可以設置相關性距離。
Net Cull distance Squared:相關性平方。如果要設置相關性距離為4米,則 Net Cull distance Squared的值就是160000(4米等於400厘米,400厘米的平方是160000)。
現在把相關性距離設置為4米:
把“運行專用服務器”勾選上(相關性對服務器來說是無效的,服務器能看到所有對象。),然后運行游戲:
兩個角色在4米以內是可以相互看到對方。
超過4米后,原地等待大概5秒鍾,就看不到對方了。
如圖所示:這個時候第一個窗口開火,如果能打到第二個窗口的角色對方,第二個窗口角色也是會掉血的,但第一個玩家不會收到第二個玩家掉血的服務器通知,因為兩者已經超出了相關性距離。如果2個玩家再次靠近在4米內,第一個玩家就會重新收到第二個玩家掉血的更新通知“多路傳送(廣播)”則不會重新收到第二個玩家的掉血通知。
“更新通知”和“多路傳送(廣播)”的一個區別就是:如果事件發生的時候不在相關性距離內,“更新通知”會重新在相關距離內的時候重新進行“更新通知”,而“多路傳送”則就算再次進入相關性距離也不會收到通知。
再往前走,距離4米內,又可以看到對方了。看不到對方的時候,對方的相關變化不會通知到另外一方。