c# - 提高 C# 套接字性能

标签 c# performance sockets asyncsocket

我们有一个用 C# 编写的 TCP 异步套接字游戏服务器,为许多并发连接提供服务。除了以下问题之外,其他一切正常:

  1. 某些用户经常断开连接(并非所有人都介意)
  2. 连接速度慢时用户的性能下降

大多数面临此问题的用户都使用 GSM 连接(基于 CDMA 的可移植 USB 适配器),并且信号强度通常很差。所以基本上他们的带宽相当差。也许每秒低于 1KB。

我的问题:我们可以做些什么来使连接更加稳定并提高性能,即使对于较慢的连接也是如此?

我正在考虑客户端和服务器端的动态 TCP 缓冲区,但不太确定由于为我的方向的每个连接动态执行此操作的开销而导致的性能下降是否正确。

最大数据包大小低于 1 KB。

当前服务器和客户端上的 TCP 缓冲区大小为 16KB

任何关于如何在 C# 中为较差或缓慢的连接编写稳定的 anync 套接字代码的指针或引用都会有很大的帮助。提前致谢。

最佳答案

“性能”是一个非常相对的术语。看起来您主要关心的是数据传输速率。不幸的是,考虑到低带宽连接,您对此无能为力 - 也许数据压缩可以有所帮助,但实际效果取决于您的数据,并且传输速率改进与压缩/解压缩延迟之间始终需要权衡。任何类型的互动游戏都需要考虑延迟。

正如 @Pierre 在评论中建议的那样,您可以考虑使用 UDP 进行传输,但这只有在您可以容忍数据包丢失和重新排序的情况下才有效,而这又取决于数据以及您对数据的处理方式。

我建议研究的另一种方法是提供两种不同的服务质量模式。良好链接的客户端可以使用全部功能(例如,全分辨率游戏图像),而低带宽客户端将获得较少的选项(例如,尺寸小得多的低质量图像)。您可以测量客户端连接/握手的初始往返时间来选择模式。

希望这能有所帮助。

关于c# - 提高 C# 套接字性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12288309/

相关文章:

c# - 从另一个 IList 的一部分快速创建列表

c# - 何时使用 ExecuteScalar、ExecuteReader 和 ExecuteNonQuery?

java - 在运行时用 TCP 套接字替换打洞/STUN UDP 套接字

套接字和 COBOL

c# - TestScheduler 创建的 ColdObserver 在 OnCompleted 时不取消订阅?

使用 FileOpenPicker 进行 C# UWP LiveSKD 和 OneDrive 访问

c++ - 整数除法算法

performance - 如何为不同的 HTTP 请求分配用户数?

mysql - MySQL 重载时的性能问题

javascript - 通过 Websocket 更新 Polymer 组件?