我正在开发一个用C ++编写的游戏服务器,我正在尝试决定要使用多少个线程以及要线程化的任务。基本的服务器骨架包括键盘I / O和输出到控制台,接受传入连接,发送传出连接,以及做游戏“东西”。
我想知道的是哪些事情应该给予一个单独的线程。每个连接应该有自己的线程吗?我知道这是变量,它取决于项目左右,但我希望它能够支持相当数量的玩家(如果可能的话,会有数百个玩家)。
答案 0 :(得分:2)
标准答案应始终如下:首先尝试最简单的方法,并且只有在简单方法不够好的情况下才寻找提高性能的方法。但是,重新构建一个大型C ++程序可能是一个痛苦的经历,所以提前猜测一些性能可能是合适的。
理论上,在现代机器上可能有数百个线程可以使用。我记得,针对Linux的NPTL实现已经测试了数万个线程。如果这是您实施的最简单方法,那么它可能是正确的答案。
但是,高性能Web服务器和类似服务器通常使用事件驱动模型。考虑像libevent这样的库。我确信有相同目的的C ++库。
我个人认为,没有一流延续的语言,或者至少是协程,对于这类工作来说是不好的选择,但是C语言系列是我们今天完成工作的方式,所以关闭我们。 : - )
答案 1 :(得分:1)
一个好的解决方案是使用Thread pool。
想法是让主线程在固定数量的线程中公平地调度所有连接。 通过良好的设计,您可以轻松地在运行时设置线程数。
您可以找到更多信息here。
创建更多线程而不是CPU核心没有生产力,并且由于线程之间切换所花费的时间,添加太多线程会降低性能。
例如,为了编译一个大项目(它不是完全相同的,但它对两种情况都有效),通常建议不要使用比CPU核心数+ 1更多的线程。
答案 2 :(得分:0)
一种非常常见的技术是让游戏服务器在一个线程上运行,通过在每个套接字上使用select来监视多个连接(即套接字)。当数据可用时,抓取数据并将其排入生产者/消费者类型模型中,以便游戏引擎获取。
这绝不是最终所有的实现,但它应该足以让你开始。听起来很酷的项目。祝你好运!
答案 3 :(得分:0)
如果您设置连接并以导致线程阻塞等待IO的方式使用它们,那么您应该能够在一个线程上为所有连接和键盘提供服务。您可能不希望将控制台输出放在同一个线程上,就像我见过的情况(至少在Windows上),其中写入控制台的速度实际上是瓶颈(即如果控制台窗口最小化,则进程运行快得多。)
如果您的游戏引擎的工作并行很好,那么您可能希望设置使用尽可能多的线程,因为CPU少于一个(对于OS和其他两个线程)。如果您希望客户端在同一台机器上运行,服务器将要检测它并缩减它使用的线程数。