1

我正在使用 C++ 编写的游戏服务器,我正在尝试确定要使用多少线程以及要线程处理哪些任务。基本的服务器骨架由键盘 I/O 和输出到控制台、接受传入连接、发送传出连接和执行游戏“东西”组成。

我想知道的是应该给哪些东西一个单独的线程。每个连接都应该有自己的线程吗?我知道这是可变的,它取决于项目左右,但我希望它能够支持相当数量的玩家(如果可能的话,在数百人中)。

4

4 回答 4

2

标准答案应该始终是:首先尝试最简单的方法,只有在简单的方法不够好时才寻找提高性能的方法。但是,重新构建大型 C++ 程序可能是一种痛苦的经历,因此提前对性能进行一些猜测可能是合适的。

从理论上讲,在现代机器上可能有数百个线程是可以的。我记得,Linux 的 NPTL 实现已经用数万个线程进行了测试。如果这是您实施的最简单方法,那可能是正确的答案。

但是,高性能 Web 服务器和类似服务器通常使用事件驱动模型。考虑一个像libevent这样的库。我确信有相同目的的 C++ 库。

我个人认为,没有一流延续的语言,或者至少是协同程序,对于这类工作来说是糟糕的选择,但是 C 语言家族是我们今天完成工作的方式,所以我们走吧。:-)

于 2012-11-13T02:06:34.123 回答
1

一个好的解决方案可能是使用 Thread pool

想法是让主线程在固定数量的线程中公平地调度所有连接。通过良好的设计,您可以轻松设置运行时的线程数。

您可以在此处找到更多信息。


创建多于 CPU 内核的线程是没有效率的,并且添加过多的线程会降低性能,因为在线程之间切换需要时间。
例如,对于编译一个大型项目(它并不完全相同,但对两种情况都有效),通常建议使用的线程数不超过 CPU 内核数 + 1。

于 2012-11-13T02:08:28.353 回答
0

如果您设置连接并以导致线程阻塞等待 IO 的方式使用它们,那么您应该能够在一个线程上为所有连接和键盘提供服务。您可能不想将控制台输出放在同一个线程上,正如我所看到的情况(至少在 Windows 上),写入控制台的速度实际上是一个瓶颈(即,如果控制台窗口最小化,则进程运行快得多)。

如果您的游戏引擎的工作并行化得很好,那么您可能希望设置使用与 CPU 数量一样多的线程(对于操作系统和其他两个线程)。如果您希望客户端在同一台机器上运行,服务器将希望检测到它并缩减它使用的线程数。

于 2012-11-13T02:10:01.540 回答
0

一种非常常见的技术是让游戏服务器在一个线程上运行,通过在每个套接字上使用一个选择来监视多个连接(即套接字)。当数据可用时,获取数据并将其放入生产者/消费者类型模型中,以供游戏引擎获取。

这绝不是万能的实现,但它应该足以让您入门。听起来是个很酷的项目。祝你好运!

于 2012-11-13T02:00:35.673 回答