簡體   English   中英

C#-網絡與服務器

[英]C# - Network vs. Server

我一直在開發一個仿真器,它分別發送一些數據包,但是接收數據包的客戶端能夠處理從單個接收中收到的多個數據包。

這是我的方法:

    /// <summary>
    /// Sends a few packets at login to prepare the character for gameplay.
    /// </summary>
    /// <param name="character">The character to produce frame for.</param>
    public void SendLoginWelcome(Character character)
    {
        character.Session.SendData(new NewMapRegionPacketComposer(character).Serialize());
        WelcomeScreen.Show(character);
        SendCloseInventoryInterface(character);
        SendTab(character, 6, 745);
        SendTab(character, 7, 754);
        SendTab(character, 11, 751); // Chat options
        SendTab(character, 68, 752); // Chatbox
        SendTab(character, 64, 748); // HP bar
        SendTab(character, 65, 749); // Prayer bar
        SendTab(character, 66, 750); // Energy bar
        SendTab(character, 67, 747);
        character.Session.SendData(new ConfigPacketComposer(character, 1160, -1).Serialize());
        SendTab(character, 8, 137); // Playername on chat
        SendTab(character, 73, 92); // Attack tab
        SendTab(character, 74, 320); // Skill tab
        SendTab(character, 75, 274); //  Quest tab
        SendTab(character, 76, 149); // Inventory tab
        SendTab(character, 77, 387); // Equipment tab
        SendTab(character, 78, 271); // Prayer tab
        SendTab(character, 79, 192); // Magic tab
        SendTab(character, 81, 550); // Friend tab
        SendTab(character, 82, 551); // Ignore tab
        SendTab(character, 83, 589); // Clan tab
        SendTab(character, 84, 261); // Setting tab
        SendTab(character, 85, 464); // Emote tab
        SendTab(character, 86, 187); // Music tab
        SendTab(character, 87, 182); // Logout tab
    }

CloseInventory和SendTab方法:

    /// <summary>
    /// Closes the inventory interface.
    /// </summary>
    /// <param name="character">The character to produce frame for.</param>
    public void SendCloseInventoryInterface(Character character)
    {
        character.Session.SendData(new InterfaceConfigPacketComposer(character, 
            (short)(character.Hd ? 746 : 548), 71, true).Serialize());
    }

    /// <summary>
    /// Sends a tab interface.
    /// </summary>
    /// <param name="character">The character to produce frame for.</param>
    /// <param name="tabId">The id of the tab.</param>
    /// <param name="childId">The child if of the tab.</param>
    public void SendTab(Character character, short tabId, short childId)
    {
        character.Session.SendData(new InterfacePacketComposer(character, 1,
            (short)(childId == 137 ? 752 : (character.Hd ? 746 : 548)), 
            tabId, childId).Serialize());
    }

Serialize()方法基本上將標頭和有效負載連接在一起。 SendData()方法僅通過套接字(異步)發送字節數組。

如您所見,im基本上同時在多個數組中同時發送多個數據包。 我的問題是,對於服務器的穩定性和性能,在數組中發送該方法(我必須將每個數組合並為一個,然后通過網絡發送)或在組合后將其原始發送,哪種方法更有效。

加入陣列可能會導致一些性能問題,因為這是一台多玩家服務器,所以服務器擁有的玩家越多,服務器負載就越大。 分別發送和合並發送會有所不同嗎?

您發送的數據包越多,其帶寬就會吸收更多的帶寬。

雖然還有其他問題...我認為針對數據部分選擇udp vs tcpip更為重要。

確實,您要壓縮數據,因為帶寬和延遲是瓶頸……解壓縮的成本可能要少得多。

至於性能問題,不可能從給出的內容中先驗地回答。

確實,問題在於數據包的頻率與數據包的大小,到達/冗余的幾率等(如果是udp)相對於要發送的數據總大小的優化問題。

恐怕它的答案不多,但是任何權威性的答案的確是不負責任的。

確實,您必須執行實驗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM