2009-12-02 149 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有执行的实验性功能。