大家好!我是长三月,一位在游戏行业工作多年的老程序员,专注于分享服务器开发相关的文章。
一周一次的系列分享又与大家见面了。这次的主题是设计高效的线程模型,是并发类别下的第一篇。
在游戏服务器开发中,一个高效的线程模型可以充分利用多核能力,将cpu的利用率发挥到极致,并且降低请求响应时间,带给玩家尽量低的延时体验。
在许多场合需要评估是使用一个线程还是多个线程。适合分拆成多线程执行的场合是:多个任务彼此独立性高,而且单线程串行执行可能达到单核能力上限的瓶颈。下面是一个关于开房间战斗的例子,每个房间都有若干玩家一起战斗,房间之间彼此独立。原始的设计是使用单线程执行所有战斗房间的计算任务:
这样设计的问题是,由于战斗计算是CPU密集型的计算任务,当房间数量增多到一定程度时会达到单核性能瓶颈,无法在原定的一帧时间内执行完所有的房间计算,导致掉帧的情况出现。解决办法是开启多个线程分担计算压力,每次有新房间创建就投放到一个最空闲的线程中管理。因为房间之间彼此独立,所以也不需要考虑任何同步相关的问题:
同样典型的场景还有MMO中的大地图,由于整个地图运算量巨大,通常会考虑使用多线程分担计算量,拆分角度通常是按地图区域,每个区域分配一个线程,或者是按业务类型,每种独立的业务逻辑分配一个线程。
不过,并不是所有的任务都适合分拆到多线程。使用多线程相比单线程,至少有以下缺点:
- 需要更多地考虑线程之间同步的问题。这对于程序员带来了额外的开发负担,处理得不好可能导致死锁或状态错误等严重问题。而且如果同步粒度太大,会使多线程对性能的提升变得很有限。
- 多线程线程切换会带来额外性能开销,另外每个线程都要分配独立的堆栈空间。<
设计高效游戏服务器线程模型:并发与多线程策略

本文介绍了在游戏服务器开发中如何设计高效的线程模型以充分利用多核性能,降低延迟。文章通过举例说明了何时适合使用多线程,以及多线程可能带来的同步问题和性能开销。作者提出了解决方案,如按业务类型划分线程池,避免同步和单点过热,并探讨了Actor和CSP等不同的并发模型在优化线程模型中的作用。
最低0.47元/天 解锁文章
1031





