本文主要是介绍【Unity】万人同屏, 从入门到放弃之——多线程RVO避障,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
不使用Dots能否实现海量物体同屏?很多场面宏大的游戏,尤其是Rougelike游戏,动辄成千上万满屏怪,割草清屏的快感酣畅淋漓,所以这类游戏非常火爆,然鹅是怎么做到的呢?
首先,海量移动物体用寻路是行不通的,即使是支持多线程的A * Pathfinding Pro区区三五百个就开始严重掉帧。
测试环境:
Unity 2022.3.9f1, URP 14.0.8
模型顶点数1195, LOD1顶点数858,LOD2定点数530
PC:i7-13700KF + 3070 8G;
手机端Android:骁龙8 gen2;
PC端RVO避障测试:
PC端Unity Editor下压测,区区5000人就快掉到50帧, 先帝创业未半而中道崩殂。CPU端性能消耗主要再RVO避障每帧构建KDTree计算,然而用上多线程基本问题不大,最大的瓶颈在GPU;
PC, 5000人:
手机端骁龙8 gen2真机,3千人就已经扛不住了,掉到24帧。用的HybridCLR热更解释执行,不过即使是AOT也只能再高出5 - 10帧左右。
手机, 3000人:
动画部分毫无疑问,不能用Animator。是通过把骨骼动画每帧的顶点信息写到Texture,运行时使用Mesh Render + Shader从中从顶点Texture中把位置读出来用,SRP会自动合批:
使用LOD:
Okay, 压力都来到了GPU, 那就降低顶点给GPU降降温吧,使用LOD功能, LOD1 顶点降低30%, LOD2 降低60%的情况下,果然效果显著:
PC端5000人, 帧数几乎翻倍,100帧左右:
手机端3000人, 也几乎翻倍, 帧数来到了44:
就这? ??而且这是在没有复杂游戏逻辑的情况下的表现,实际项目中还会大打折扣。看来,使用传统方式不要说万人同屏,千人都费劲。
结论: 传统方式极限发挥也就是千人同屏的水平,放弃!
不过RVO避障还是需要的。测试项目基于开源RVO2 C#版修改:GitHub - snape/RVO2-CS: Optimal Reciprocal Collision Avoidance (C#)
主要对原版RVO做了以下修改:
1. 使用Easy Threading并行刷新RVO Agent;
2. 增加删除Agent的功能;
3. 增加Agent避障权重设置,如,把到达目标位置的Agent权重设置为0后, 它就不会被其它Agent挤走;
4. 增加形状障碍物,BoxObstacle、 CircleObstacle、EdgeObstacle;
5. 性能优化,使用ArrayPool取代每帧创建数组;
6. RVO.Vector2改为Unity Vector2,以及RVO.Math优化,避免原版分母为0导致的异常。
RVO2 Unity修改版:GitHub - sunsvip/UnityRVO2: RVO for unity
注意:
如上使用的多线程并非Dots中的JobSystem,因此线程间数据传递会导致大量gc。
强烈推荐Job System版RVO:【Unity】十万人同屏寻路? 基于Dots技术的多线程RVO2避障_TopGames的博客-CSDN博客
这篇关于【Unity】万人同屏, 从入门到放弃之——多线程RVO避障的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!