2009-12-02 150 views
0

我一直在模擬器上工作,它分別發送幾個數據包,但接收數據包的客戶端能夠處理來自單個接收的多個數據包。C# - 網絡與服務器

這裏是我的方法:

/// <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()方法主要連接頭和togeather有效載荷。 的SendData()方法只是通過套接字(異步地)發送一個字節數組。

正如你所看到的,IM基本上同時發送多個數據包,但在不同的陣列中。我的問題是什麼是對服務器的穩定性和性能的更高效,發送陣列(我有各自的陣列的加盟爲一體,然後通過網絡發送)或發送它已經由生後內的方法。

連接數組可能會導致一些性能問題,因爲這是一個多玩家服務器,服務器的玩家越多,服務器負載就越多。將單獨發送,與​​發送它合併有所作爲?

回答

1

數據包越多,你發送更多的帶寬得到由他們的開銷吸收。

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

真的想要壓縮數據,因爲帶寬和延遲是瓶頸......解壓縮的成本可能會少得多。

至於性能問題,它不可能回答什麼是給出一個先驗。

真的這個問題是一個optomisation問題的數據包的頻率與數據包的大小vs到達/重複數據等(如果udp)與發送數據的總大小的大小的差異。

它恐怕沒有太多的答案,但任何權威的答案真的是不負責任的。

你們也是goign有執行的實驗性功能。