了解UE4同步傳輸的開銷(Bunch Overhead)
這篇文章其實算是Network Profiler (一) (二) 的後續 主要是利用Profiler分析的過程中發現replicate property已經減少很多 可是total send Bytes沒有如預期的下降到目標 經過追查研究後 發現問題在Bunch Overhead後 才有了這一篇文章的內容 Bunch Overhead 如果降replicate傳輸到一定程度之後,會發現其實Bunch Overhead蠻大的。 從Profiler裡面可以看到Bunch Overhead分為 Bunch Headers ContentBlock Headers Content Footers Handles Export GUIDS MustBeMapped GUIDS 這幾個項目 如圖1.所示 圖1. BunchOverhead的細項可在Network Profiler的Summary內找到 其中我只稍微追查Bunch Headers, Handles, Export GUIDS這幾項而已,其他項目因為傳輸不多所以我沒有深入追。 Bunch Headers Bunch Header到底傳了那些,可以在 Engine/Source/Runtime/Engine/Private/NetConnection.cpp 的UNetConnection::SendRawBunch() 裡面追查到 大致上就是這個Bunch 是open/close,是不是reliable, channel index是多少等等的資訊 Bunch headers的資料量從我們開發端是很難省掉的,不過引擎端因為Fornite持續在開發的關係,應該會不斷地改進。 例如以前有Bunch.bIsDormant現在直接被合併進 enum EChannelCloseReason Bunch.CloseReason。 Export GUIDS 這個項目主要發生在Server 要同步一個新的Actor給client的時候,需要利用GUID跟client建立對應關係 如果是動態生成的物件,會直接使用物件的路徑+名稱,以字串的方式作為GUID傳送 舉例來說server生成一個新的需要同步的Actor 路徑在Content/...