【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人:

【Unity】万人同屏, 从入门到放弃之——多线程RVO避障_第1张图片

动画部分毫无疑问,不能用Animator。是通过把骨骼动画每帧的顶点信息写到Texture,运行时使用Mesh Render + Shader从中从顶点Texture中把位置读出来用,SRP会自动合批:

【Unity】万人同屏, 从入门到放弃之——多线程RVO避障_第2张图片

使用LOD:

Okay, 压力都来到了GPU, 那就降低顶点给GPU降降温吧,使用LOD功能,  LOD1 顶点降低30%, LOD2 降低60%的情况下,果然效果显著:

PC端5000人, 帧数几乎翻倍,100帧左右:

 手机端3000人, 也几乎翻倍, 帧数来到了44:

【Unity】万人同屏, 从入门到放弃之——多线程RVO避障_第3张图片

 就这? ??而且这是在没有复杂游戏逻辑的情况下的表现,实际项目中还会大打折扣。看来,使用传统方式不要说万人同屏,千人都费劲。

结论: 传统方式极限发挥也就是千人同屏的水平,放弃!

不过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

你可能感兴趣的:(Unity,unity,千人同屏,RVO,GPU动画)