如何使用它

獲得主機間延遲(ping time)

作為獲取 ProudNet 中主機之間的延遲(ping time or lag)的方法, 得到的ping time是roundtriplatency,即從這邊的主機向那邊的主機發送信息後,在那邊的主機立即應答所需的時間。

- 函數從伺服器取得一個客戶端的延遲

C++ 函數
C# 函數
註釋

Proud.CNetServer.GetLastPingSec

Nettention.Proud.NetServer.GetLastReliablePingSec

以秒爲單位獲取相應客戶端的最後等待時間。

Proud.CNetServer.GetLastUnreliablePingMs

Nettention.Proud.NetServer.GetLastUnreliablePingMs

以Ms爲單位獲取該客戶端的最後等待時間。

Proud.CNetServer.GetRecentPingSec

Nettention.Proud.NetServer.GetRecentReliablePingSec

以秒爲單位獲取相應客戶端的最後等待時間。

Proud.CNetServer.GetRecentUnreliablePingMs

Nettention.Proud.NetServer.GetRecentUnreliablePingMs

以Ms爲單位獲取該客戶端的最後等待時間。

- 從客戶端獲得服務器或連接到P2P的其他客戶端的延遲的函數

C++ 函數
C# 函數

Proud.CNetClient.GetLastUnreliablePingSec

Nettention.Proud.NetClient.GetLastUnreliablePingSec

Proud.CNetClient.GetLastUnreliablePingMs

Nettention.Proud.NetClient.GetLastUnreliablePingMs

Proud.CNetClient.GetLastReliablePingSec

Nettention.Proud.NetClient.GetLastReliablePingSec

Proud.CNetClient.GetLastReliablePingMs

Nettention.Proud.NetClient.GetLastReliablePinMs

Proud.CNetClient.GetRecentUnreliablePingSec

-

Proud.CNetClient.GetRecentUnreliablePingMs

Nettention.Proud.NetClient.GetRecentUnreliablePingMs

Proud.CNetClient.GetRecentReliablePingSec

Nettention.Proud.NetClient.GetRecentReliablePingSec

Proud.CNetClient.GetRecentReliablePingMs

Nettention.Proud.NetClient.GetRecentReliablePingMs

circle-exclamation

circle-info

對於Reliable消息傳輸方式,採用雙向通信方式,收發時間比Unreliable慢,但保證收發順序和到達的確定性。

circle-info

對於Unreliable消息的傳輸方式,採用單向通信方式,傳輸時間比Reliable快,但傳輸順序可能會出現偏差,無法保證到達的確定性。

不同語言的程式之間進行通信

兩個程序通過ProudNet進行通信,但有時想用不同的編程語言製作。 在這種情況下,PIDL編譯器可以生成兩種或兩種以上語言的proxy和stub,然後每個程序都拿需要的東西寫下來。

對於int、double、string等基本類型,ProudNet的C++以外語言的Rapping模塊已經提供。 但是,如果語言不同,這種基本類型的名字基本上會有所不同。 例如,C# 的字符串類是 System.String,在 C++ 中是 std::string , std::wstring, ATL::CString , Proud::String

爲了解決這個問題,PIDL編譯器提供在用戶需要時,將生成的proxy、stub中的變量類型僅限於特定語言的功能。

下面是一個用法範例。

自定義每個主機的數據 (Host Tag)

接收RMI或事件回撥時,一起接收Proud.HostID以進行識別。 開發遊戲服務器時,如果收到Proud.HostID,就以該值爲依據搜索相應Host的對象,然後處理其對象,ProudNet樣本程序也是以這種方式製作的。

Host Tag是指除HostID外,用戶還可以爲本地主機和其他主機定義的識別數據。

利用這些可以進一步提高程序的性能。

不使用 Host Tag 的示例

Host Tag

Host Tag被指定爲以下方法。

C++ 函數
C# 函數

Proud.CLanClient.SetHostTag

-

Proud.CLanServer.SetHostTag

-

Proud.CNetClient.SetHostTag

Nettention.Proud.NetClient.SetHostTag

Proud.CNetServer.SetHostTag

Nettention.Proud.NetServer.SetHostTag

circle-exclamation

Host Tag通過Proud.RmiContext.m_hostTagProud.CNetPeerInfo.m_hostTag接收,不會發生網絡同步,不會傳播給對方。

設定Thread Pool

ProudNet的網絡客戶端模塊CNetClient和服務器模塊CNetServer使用兩種Thread Pool

  • Networker thread pool: 僅用於ProudNet內部處理,負責插座I/O處理等。

  • User worker thread pool: 用於執行自定義例程 。 處理RMI或回撥活動等

為了獲得最佳效能,請明確建立一個線程池並將其設置在網路模組上,以確保共享特定的線程池,而不是每個擁有這些線程池的模組。

circle-info

當前客戶端使用此功能時,需要include ProudNetServer.h1.7.36365 後無需include ProudNetServer.h

triangle-exclamation

以下是與整體趨勢相關的假代碼。

線程池設置方法基本與上述相同,根據您想要的Case添加不同的設置值。 不僅是服務器,客戶端也可以設置多個線程模型。

- 共享多個網絡模塊相同的Thread Pool

服務器上多個主機模塊相同的Thread Pool共享示例

- 使用不同數量的 Networker 和 User worker thread pool

- 整合 Networker 和 User worker的thread pool

- 純單線程模型

這是爲了將純粹以單線程運行的服務器升空到CPU數量的方法,需要創建完全沒有線程的線程池客體,並持續呼叫手動讓線程池呼吸的函數。

circle-exclamation

配置 Thread Model - 客戶端

上面分離了user worker和networker,防止發生錯誤,但FrameMove仍有需要明確呼叫的部分。 這提供了可以在需要時運行累積的RMI的優點。

客戶端的代碼複雜,調用Process或FrameMove時,無需擔心邏輯扭曲或因失誤導致相應代碼遺漏等情況,設定方法是Thread Model設置。 ProudNet對網絡提供多種操作方法,但也可以設置爲不在意。

- ProudNet 線程模型類型

  • ThreadModel_SingleThreaded: RMI 和消息回撥在用戶呼叫 FrameMove 時完成 。 (默認)

  • ThreadModel_MultiThreaded: 用戶無需呼叫FrameMove即可完成回撥。

  • ThreadModel_UseExternalThreadPool: 當指定thread pool時,必須將其設定為此。

以上值可在CNetConnectionParamm_netWorkerThreadModelm_userWorkerThreadModel中設置。 默認值爲ThreadModel_SingleThreaded

非同步運行使用者例程

您可以使用 Proud.IRmiHost.RunAsync() 非同步運行函數或 lambda 表達式 A。 Proud.IRmiHost.RunAsync() 立即返回,A 在線程池中的線程之一上運行。

如果A爲指定的HostID的主機H運行,則H的callback函數和A不能同時運行。

發送量過多時警告功能

ProudNet的伺服器和網路具有當傳輸量超過線路速度時進行偵測和警告的功能。包含ErrorType_SendQueueIsHeavy Proud.INetCoreEvent.OnWarning 將被回呼。

發送量過多時,建議改善不必要的信息或發送量自動調節功能 (Throttling)

Last updated