TW项目后端加速
一、问题描述
对于回合制游戏,战斗每秒运行一次(一个回合),在这一次战斗中要进行所有的军队(army)的攻击、反击和将领(英雄)的技能的计算。大致的计算方法如下:
军队攻击:
for 所有军队
for 军队中所有的不同兵种
for 被攻击军队的兵种
计算当前增益、互克等
计算当前兵种总攻击,被攻击军队防御和反击
按计算公式计算当前军队总伤害
按计算公式计算被攻击军队的反击伤害
虽然计算公式不会特别复杂,但是如果军队数量比较多的时候,战斗计算线程就会较卡。通过计算,当有5000个部队同时战斗的时候,这样战斗线程就会运行几十甚至100多毫秒。而当前的战斗结果(战报)发送给前端,也要花费较长时间。上述问题会导致服务器在战斗发生比较频繁、比较集中的时候
二、战斗运算的解决方案
1、多线程计算+战斗线程与CPU内核绑定(https://github.com/OpenHFT/Java-Thread-Affinity.git)
优点:实现简单,不增加运营成本
缺点:需要加锁,极端情况也会比较卡。
结论:在需要快速实现和团队能力有限的情况下采用这个方法。
2、GPU计算(CUDA)
优点:由于可以用GPU进行并行运算,所以战斗运算所用的GPU时钟周期为0毫秒。
缺点:开发相当困难,相关代码要大量改进,需要有较高的技术水平的人才能开发。
结论:经实际测试,CPU的计算能力是GPU的5-10倍,CUDA编程时用GPU计算最重要的就是尽量少次数的内存传输(Device<->Host)、减少不同数据之间的逻辑耦合。用N卡的GeForce系列显卡运算的话,CPU也要同时运算,GPU的运算结果用于显示,CPU的运算结果用于实际计算。在团队工期不是特别紧张、有相关技术的时候可以采用这个方法。
三、网络并发的解决方案
1、修改TCP/IP底层为DPDK,TCP这一层采用MTCP,同时使用KCP代替UDP收发大部分游戏内逻辑消息。
2、不同的战斗区域,可以分开计算,然后分开发结果。