多核线程 大家好。我是地下城与勇士客户端优化组组长。
现在地下城与勇士客户端通过一个线程,即主线线程,它执行着怪物、技能等对象的生成和移动、打击判定等所有逻辑运算。另外,所有这些运算的结果在屏幕上呈现的过程——渲染也都是通过主线程顺序处理的。
在21世纪初和中期开发的大多数游戏都采用了这种方式,当时大多数游戏都采用了单核CPU的PC。
但到了21世纪末,采用多核CPU的PC开始普及,一些商业游戏引擎开始采用并行处理结构来利用多核来提高客户机的性能。
地下城与勇士客户端也只是在部分领域借用并行处理结构进行了性能优化,但并没有达到冒险家们满意的效果。
这是因为客户端的核心区域——战斗逻辑和渲染过程——仍然是由串行处理结构构成的,所以出现了只有一个线程(如前面提到的主线程)会产生过多的运算负载的问题。
首先解释(辩解)之前地下城与勇士客户端的核心区域无法更改为并行处理结构形式的原因..
15年以上的服务过程中产生了大量的代码,
即使在改进到并行处理结构的过程中,服务也必须保留,因此,新的内容将继续根据现有结构生产。
最后就算把前面提到的问题都解决了...改进的结构是否能保证服务的稳定性?的问题。
即使这样,也不能不走该走的路,继续拖延下去...我们一直在寻找和尝试如何在不影响服务稳定性的前提下做出最佳选择。下面要介绍的这些工作都是经过前面的过程进行的,在过去的一个月里,我们首先部署在第一服务器上,进行了基本的稳定性测试,所以我们才会在正式版上进行部署。
当然,到目前为止,我还没有达到百分之百的满意程度。让我们看看我们迈出了多核支持的第一步。 将添加渲染线程。 一种线程,它负责一系列过程,以便通过主线程获得运算输出,并使用DirectX将其输出到屏幕上。 -预期效果:随着与主线程内渲染相关的计算负载减少,客户机的平均FPS得到提高。 加载线程得到改进。 根据主线程或渲染线程的需要加载指定文件并将其加载到内存中的线程。请注意,以前的地下城与勇士客户端也使用加载线程执行文件加载,但由于结构不好,导致主线程瓶颈,所以我们对其进行了改进。此外,新的负载线程结构也得到了补充,可以按线程数量动态调整,以与核心数量成正比。 -预期效果:在游戏过程中动态生成/召唤的怪物或效果等造成的部分暂时性客户端瓶颈得到缓解。 添加键指令输入检测(历史记录)线程。 负责接受并记录玩家输入的线程。在逻辑运算之前,主线线程接收用户通过键指令输入检测线程记录的输入并执行命令。请注意,传统客户机在主线程中完成了从用户输入到解析的一系列过程,因此在过度运算或渲染的情况下,当主线程出现瓶颈时,可能会出现间歇性无法接受用户输入的问题。 -预期效果:在主线程严重瓶颈情况下,玩家输入缺失的问题得到部分改善。 添加网络线程。 改进了结构,将分组发送/接收过程从主线程中分离出来,通过单独的线程处理,而分组发送/接收过程是组队战斗所需的同步过程。 -预期效果:在发送/接收大量数据包的过程中缓解了一些临时瓶颈。
|