概述
在游戏开发中多单位对战游戏会存在如下技术难点:
- 多单位渲染
- 多单位碰撞
- 移动单位的避障
- 多单位索敌
- AI
多单位渲染
传统游戏中会使用传统骨骼动画计算(CPU计算骨架+GPU计算蒙皮),这里存在的问题是,每一个单位都需要CPU单独去计算骨骼位置,同时还需要把顶点信息重新传给GPU,导致性能非常低。
一般解决方案是采用贴图骨骼动画,或者叫顶点动画。将骨骼运动信息提前写入纹理中,然后缓存在GPU的缓存上。从而提升性能。
参考文章:https://zhuanlan.zhihu.com/p/598193811
参考技术:https://github.com/chengkehan/GPUSkinning
多单位碰撞
物体之间的碰撞需要物理引擎支持,大概的原理是一个物体获取到周围的物体,然后遍历进行碰撞处理。这里一般会使用类似kdtree或者八叉树的数据结构对物体进行索引。
而unity原生提供的碰撞:Collider 是一个性能极差的实现。可能原因是它是单线程进行碰撞检测的。
![](https://img.haomeiwen.com/i14230858/05f967d63a9fcbab.png)
参考视频:https://www.youtube.com/watch?v=8zo5a_QvJtk
而Unity新推出的Dots系统,则可以支持超多物体的碰撞:
![](https://img.haomeiwen.com/i14230858/c8180a9efc5140c8.png)
Dots使用了ECS架构,并充分使用多线程,同时支持使用Brust编译器对C#代码进行编译,这使得他的性能好了很多。但是Dots也存在一些问题:
- Dots采用了一系列方式去对多线程逻辑进行抽象,是的用户能在一定限制下写出线程安全的代码,但是大大的提升了学习成本。
- Dots使用了ECS架构,这块比较类似与后端编程的思想,但是相比于传统Unity的OOP还是复杂很多。
- Dots是一个新技术,并不完善,官方对于很多别的场景都没有给出解决方案(例如动画,UI,Audio等),因此需要踩很多坑
移动单位的避障
参考文章:https://zhuanlan.zhihu.com/p/109556568
这里介绍了RVO2,也就是文中的ORCA。它使用了一种分布式算法,可以让Agent并行执行避障逻辑。每个Agent实际是去进行碰撞判断,然后动态的改变自己的方向向量从而避免与别的Agent碰撞。
这个算法不仅解决了单位的局部避障问题还同时解决了单位之间的碰撞问题。
参考代码:https://github.com/warmtrue/RVO2-Unity
不过我实际测下来新能没有想象中的那么好,能支持2000个Agent在60FPS下运行。
多单位索敌
索敌,其实就是找到单位附近的敌人。实际是一种搜索算法。一般来说我们通过使用kdtree类似的数据结构对单位建立索引就可以高效的去进行索敌。
但是我们存在很多单位,必须多线程去进行索敌。如果我们使用传统Unity的Physics.overlap*方法,无法使用多线程,性能就存在问题。
如果使用Dots的物理系统可能能解决这个问题(但是我没有研究过)。
AI
这块主要是想说,因为单位很多,AI的逻辑也应该多线程执行。
这块可能得用上Dots。
网友评论