您當前的位置:首頁 > 遊戲

UE4 網路相關係列 導言

作者:由 孤傲雕 發表于 遊戲時間:2020-01-30

前言

鴿子了好久了, 好像, 大概, 找不到藉口繼續鴿子了, 畢竟, 嗯。。。

全文偏理論, 是篇引子, 後續會具體詳細展開, 並不斷修改完善本文, 關聯過去。

孤傲雕:UE4 網路相關係列 序

這是一篇關於

UE4 網路相關

的引子。

或者說一篇

UE4 遊戲網路同步相關

的引子。

畢竟,

遊戲的網路同步要複雜很多, 也接觸最廣泛

網路通訊原理 - 大庚年 - 部落格園

網路通訊原理 - 感動#心 - 部落格園

經濟基礎決定上層建築,

要了解網路, 也絕對要從網路通訊原理開始.

而UE4是一款強大的引擎, 自然會封裝完善這些基礎功能。

Socket

UE4 Sockets多執行緒TCP通訊

UE4 網路相關係列 導言

對應UE4 Socket及相關內容, 屬於網路通訊中最基礎的地方, 根據平臺不同, 有不同的實現。

如果只是單純使用UE4 的網路同步機制, 那如無特殊需求, 一般不必接觸。

如果要連線自己的伺服器, 例如一個聊天伺服器, 就從Socket這裡入手了。

HTTP

UE4 網路相關係列 導言

如果想和後臺進行關聯, 使用WEB服務是一個不錯的選擇。

配合Json這一資料交換格式, 實現登入系統, 日誌系統啊, 也十分容易。

而在支援網路通訊之後, 剩下的, 其實就是, 嗯, 那個叫, 千奇百怪了

DonaldW:網路遊戲同步技術概述

網路遊戲同步技術概述

實時對戰網路遊戲——基於幀同步的最佳實踐 - GameRes遊資網

聊聊網路遊戲同步那點事 - 陳嘉棟 - 部落格園

lockstep 網路遊戲同步方案

幀同步在競技類網路遊戲中的應用 - komo - 部落格園

再談網遊同步技術:實時動作遊戲同步方式和傳輸協議選擇 - GameRes遊資網

影子跟隨演算法:FPS遊戲中游戲同步性的實現 - GameRes遊資網

《王者榮耀》技術總監覆盤回爐歷程:沒跨過這三座大山,就是另一款MOBA霸佔市場了

等等, 有興趣的可以百度谷歌一下下面關鍵詞, 有趣有價值的文章很多, 非常多。

網路遊戲同步

幀同步

狀態同步

角色位置同步

遊戲網路防作弊

為了解決特定的網路問題, 相對應的解決方案也十分巧妙, 雖然大白話看起來也很簡單(笑)。

Networking Overview

UE4框架在構建時考慮到了多人遊戲。只要您遵循基本的框架約定,通常不需要做太多的工作即

可將單人遊戲體驗擴充套件到多人遊戲。

UE4網路圍繞

伺服器/客戶端模型

構建。這意味著,網路中將有一個

權威性的伺服器

(負責做出所有重要決策),然後該伺服器將確保所有連線的客戶端持續更新,從而使它們保持最新、最近似於伺服器的場景。即使是沒有聯網,

單人遊戲也有其伺服器

;在這些情況下,本地計算機將充當伺服器。

上面是UE4 官方文件中對UE4 網路的概述。

然後我們來摳摳字眼(從一些角度), 分析分析 :

字眼一 : 單人遊戲擴充套件到多人遊戲

如果有做過遊戲或者類似網路同步機制的話, 應該對以下這種情況並不陌生, 或者習以為常 :

遊戲客戶端和遊戲伺服器是完全獨立開發的, 兩者之間的通訊只依賴於一些預定義好的介面。

甚至經常, 客戶端和伺服器都不是一種語言, 邏輯要用兩種語言分別寫兩遍。

以一個3D回合制遊戲為例 :

客戶端, 即玩家視角, 是多個3D角色釋放各種炫酷的技能, 打來打去

伺服器只需要幾個資料, 玩家怪物名稱, 玩家怪物屬性, 玩家怪物索引等等來回計算。

模型? 動畫? 音效? 特效? 毫不關心

這樣做有優點也有缺點, 粗略描述一下

(瞎扯, 本人沒做過)

: 定製的永遠比通用的強, 可以自定義實現, 自定義功能, 怎麼順手怎麼方便怎麼來, 盡最大程度壓榨效能的極限。

: 不夠統一化, 伺服器和客戶端兩套邏輯,

維護麻煩

加大溝通成本

加大工作量

: 不夠通用化, 整套遊戲的客戶端伺服器通訊架構實現和遊戲邏輯

緊密耦合

, 無法形成

有效積累

...

ComblockEngine 引擎首頁 // 舉個例子

而UE4呢, 它可以將單人遊戲擴充套件到多人遊戲。

而如果有用過UE4的網路同步相關機制的話, 有一定了解, 那我們就基本可以換個說法來描述 :

UE4

客戶端程式碼和伺服器程式碼

是寫在一起的!

所以對單人遊戲的邏輯進行一定的處理, 將其網路化, 就變成了多人遊戲(手頭狗頭)

也可以說, UE4 的網路同步機制, 是將客戶端程式碼和伺服器程式碼寫在一起, 在

使客戶端和伺服器同時跑相同邏輯, 但做不同的實現

舉個例子 : 開槍事件

經過網路同步後, 各端都有開槍這一

邏輯事件

客戶端實現有槍的動畫, 聲音, 特效

伺服器的實現則是生成子彈, 計算子彈傷害等等。

因此, 重點來了 :

客戶端與伺服器端跑相同邏輯, 但做不同實現.

綜上所述呢, 單純從這一個角度來看, 如果使用UE4這套網路同步機制 :

UE4 對於

FPS射擊

遊戲,

ACT動作

遊戲,

RPG角色扮演遊戲

等很友好, 他們客戶端和伺服器可以直接跑相同邏輯, 並順帶的在伺服器做一些防作弊檢測。

UE4 對於

回合制

遊戲, 額, 及

一些

遊戲不友好, 如果讓伺服器和客戶端跑相同邏輯, 伺服器會有很多不必要的處理, 或者需要費很大力氣最佳化掉, 或者就留著增加很多不必要的開銷。

// 記得也是當初看一篇文章扯得分析, UE4 伺服器客戶端寫到一起的優缺點, 忘了出處了。

那如果不使用這一套機制呢?

隨你嘍, 自己開發完善一套伺服器, 怎麼順手怎麼來。

字眼二 : 伺服器/客戶端模型

嗯, 伺服器和客戶端。

// 待完善 為什麼採用伺服器客戶端模型

那就會有一套客戶端和伺服器連線的完整流程吧(待完善)

有了伺服器,

服務連線多個客戶端

多端的資料狀態要保證一致

, 那就有需要有一個權威端, 不然各端資料不一致, 誰也不認, 就沒什麼意思了。

而權威端, 理所應當的就是伺服器了。

既然伺服器是權威端, 那

客戶端就只能不斷的試圖去獲取伺服器的最新狀態並展示, 並試圖去影響伺服器.

不斷的去模仿, 模仿, 模仿, 若不甘心去模仿, 妄想去改變, 也只是在伺服器允許並修改後的自欺欺人的"自主表演"一樣.

UE4 提供了

Remote Procedure Calls (RPCs)

, 使客戶端和伺服器直接進行互動

UE4 也提供了

屬性同步, Actor同步

, 用於客戶端獲取伺服器當前的狀態, 並根據時機邏輯不同, 可以對其定製化處理, 十分便捷。

在此功能背後, 自然是一套強大的網路同步機制, 並由於網路環境的複雜, 提供了各種各樣的特性。

字眼三 : 單人遊戲也有其伺服器

UE4 網路相關係列 導言

這一點為什麼要強調呢?

如果, 你做的就是一個單機遊戲。

那你大可以直接忽略。

如果, 你做的是一個網路遊戲。

那就耐心的聽我瞎扯一下, 瞎分析一下 :

上文中有提到,

UE4 客戶端邏輯是和服務邏輯寫在一塊的, 對其進行一定的網路化處理, 大概就是UE4 的網路同步機制

也就是說, 會有客戶端邏輯, 伺服器邏輯兩種邏輯, 也就存在這兩種可能性 :

只跑伺服器邏輯的專用伺服器模式(NM_DedicatedServer)

只跑客戶端邏輯的客戶端模式(NM_Client)

我們來思考一下, 如果只有這樣, 好像也沒有什麼毛病, 邏輯分明, 簡單幹脆。

那, 有沒有一種情況, 他既跑伺服器, 又跑客戶端呢?

想一想, UE引擎起家於FPS遊戲, 而FPS的區域網聯機

嗯, 就是有一臺主機, 既是客戶端, 又是伺服器, 作為房主, 其他玩家連線到這臺主機上進行遊戲。

嗯, 所以我們還需要一種 :

既跑客戶端邏輯又跑伺服器邏輯的監聽伺服器模式(NM_ListenServer)

以及, 和這些需要網路的做區分, 沒有任何網路的單機模式

沒有任何網路的單機模式(NM_Standalone) // 離線模式

嗯, 沒毛病.

那, 如果我在單機模式下寫網路程式碼會是怎麼樣呢? 單機模式是隻跑客戶端邏輯? 還是隻跑伺服器邏輯? (笑)

還是說, 單機模式下不能寫網路程式碼? 只有單機邏輯?

這問題, 廢話, 單機模式只有單機邏輯唄, 寫什麼網路.

那麼, 單人遊戲為什麼也有其伺服器呢?

/** Standalone: a game without networking, with one or more local players。 Still considered a server because it has all server functionality。 */

NM_Standalone

Still considered a server because it has all server functionality。

因為他有完整的伺服器功能, 所以, 他被當做伺服器(笑)

那再瞎扯一下, 完整的伺服器功能?

他是單機遊戲, 不會有其他客戶端連線, 所有他不需要監聽網路埠.

他是單機遊戲, 沒有其他客戶端獲取伺服器的狀態, 所以他也不需要屬性同步.

好像, 這個完整伺服器功能指的是RPC可以正常使用?

那RPC功能, 背後不就是函式在哪裡呼叫? 在Server呼叫, 在Client呼叫, 好像順便支援了, 也沒什麼難度(手動狗頭)

等等, 還記得NM_ListenServer嗎?

他去掉網路埠監聽, 嗯 , 不和現在這個需求一模一樣了嗎?

那NM_Standalone實際沒有任何特殊的處理了啊.

即 :

只是伺服器 NM_DedicatedServer

既是伺服器又是客戶端, 有其他客戶端連線 NM_ListenServer

既是伺服器又是客戶端, 沒有其他客戶端連線 NM_Standalone

只是客戶端 NM_Client

我去, 好像, 這樣分類就可以了, 設計上, 都按照支援網路的來寫就可以了.

結語

這是一篇引子, 嗯, 但沒有引子對應的東西, 這個之後就開始一篇一篇水了。

UObject系列先鴿子吧。

騙讚了, 騙收藏了

標簽: 伺服器  客戶端  UE4  同步  網路