子线程渲染技术
原因:在玩家较多,且时装坐骑等差异化较大时,客户端帧率低,卡顿明显
思路:将渲染放在子线程进行,使逻辑处理和渲染可以同时进行,提高并行处理能力,提高客户端运行效率,提升帧率,缓解卡顿
方案:1、创建一个新的线程专门用来处理渲染逻辑
2、将主线程每一种渲染函数和一些设置渲染状态的方法都定义成一种渲染类型
3、每一个渲染类型对应一个渲染结构,包含渲染的数据和render方法
4、用std::array<std::vector<renderinfo*>, 2>这种结构来存储渲染数据,这样分开逻辑线程和渲染线程的访问冲突,逻辑线程向一个vector中写入数据,渲染线程从另一个已经写好的vector中读取数据执行渲染
5、逻辑线程和渲染线程执行速度会有差异,需要通过std::mutex互斥量来使两个线程协同工作(设置某个线程等待以及唤醒)
问题3:游戏最小化、修改分辨率、锁屏等操作,恢复后显示异常 原因:这些操作会导致DX设备丢失,需要通过TestCooperativeLevel获得当前设备情况,正确调用ResetDevice()函数
注意:1、保证DX渲染接口的调用都在渲染线程执行
2、对渲染有影响的成员变量要区分逻辑线程和渲染线程
3、渲染顺序和以前主线程保持一致
结果:客户端机器人身上时装是随机的,不会移动、不释放技能
添加1024个机器人 以前帧数 21左右 现在帧数 45左右
添加2048个机器人 以前帧数 10左右 现在帧数 22左右
2。屏蔽字匹配优化:AC自动机(多模字符串匹配算法)
原因:屏蔽字是采用字符串匹配方式做的,屏蔽字列表文件就有好几个,并且有的文件屏蔽字字符串有接近2W行,效率低
算法:1、构造字典树
2、构造适配指针
3、匹配过程
结果:1、AC自动机的匹配效率要高很多
2、创建AC自动机所需要的内存较大 是一种空间换时间的算法
关于AC自动机的一些链接: