【问题标题】:C# - Network vs. ServerC# - 网络与服务器
【发布时间】:2011-08-26 04:03:28
【问题描述】:

我一直在开发一个模拟器,它分别发送几个数据包,但接收数据包的客户端能够处理来自单个接收的多个数据包。

这是我的方法:

    /// <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() 方法只是通过套接字(异步)发送一个字节数组。

如您所见,我基本上同时发送多个数据包,但在不同的数组中。我的问题是什么对服务器的稳定性和性能更有效,在一个数组中发送该方法(我必须将这些数组中的每一个合并为一个,然后通过网络发送)或在组合后将其原始发送。

加入阵列可能会导致一些性能问题,因为这是一个多人服务器,服务器的玩家越多,服务器负载就越大。单独发送与合并发送会有所不同吗?

【问题讨论】:

    标签: c# networking


    【解决方案1】:

    您发送的数据包越多,它们的开销吸收的带宽就越多。

    不过还有其他问题……我认为对于数据部分选择 udp 还是 tcpip 更为重要。

    您确实希望压缩数据,因为带宽和延迟是瓶颈……解压缩的成本可能会少得多。

    至于性能问题,不可能从给定的内容中先验地回答。

    真正的问题是数据包的频率与数据包的大小与到达/冗余的几率等(如果是 udp)相对于要发送的数据总大小的大小的优化问题。

    恐怕这个答案不算什么,但任何权威的答案都是不负责任的。

    你真的要进行实验。

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 2011-06-30
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多