博文介绍了最基本的实现原理,有些老板懒得折腾,所以特意熬了几个秃头的夜把RVO、BRG、GPU动画、海量物体目标搜索等高度封装成了开箱即用的插件。
划重点!!此方案是绕开Entities(ECS),不用写一行ECS代码,现有MonoBehavior开发工作流享受Entities渲染的性能。已有项目也能使用此方案开挂,无需代码重构!
源码插件v我咨询: SunSparkStudio
性能压力测试包自取:
PC 10万动画人同屏对抗:https://pan.baidu.com/s/1CgpTV0TuFagobtAf7k38OA?pwd=xwsf
安卓 1万动画人同屏避障: https://pan.baidu.com/s/1RkXyVXt_he5uCgizTSA42A?pwd=k0ji
插件使用视频教程:
Unity低成本性能开挂 gpu动画+dots graphics万人同屏渲染 jobs rvo2 弹幕游戏海量单位索敌
效果见视频:
Unity Dots 10万人同屏RVO避障是一种什么体验? 3D人物带动画,不使用ECS
Unity弹幕游戏, RVO红蓝对抗 割草游戏 海量单位高性能索敌攻击方案压测
不使用Entities(ECS),只使用Batch Renderer Group、Job System和Burst加速,实现万人同屏RVO避障。
前面博文中尝试过使用传统多线程RVO避障,PC端5000人帧数100多帧:【Unity】万人同屏, 从入门到放弃之——多线程RVO避障_TopGames的博客-CSDN博客
RVO是算力开销大头,能不能用炸裂的Burst + Job System并行计算RVO算法呢?但是要想把RVO2替换为Job System实现也绝非易事,因为JobSystem限制非常多,用来传递处理数据的NativeContainer只允许值类型,好在github上有国外大佬早已做过相同的事。
RVO2 JobSystem实现:https://github.com/Nebukam/com.nebukam.orca
插件依赖Burst + Job System,安装URP会自动依赖这些库,除此之外还依赖两个包:
1.GitHub - Nebukam/com.nebukam.common
2. com.nebukam.job-assist: https://github.com/Nebukam/com.nebukam.job-assist
使用Unity PackageManager从github地址添加即可。
使用方法:
1. 初始化
agents = new AgentGroup<Agent>();
obstacles = new ObstacleGroup();
simulation = new ORCA();
simulation.plane = axis; //设置XY方向寻路还是XZ方向
simulation.agents = agents;
simulation.staticObstacles = obstacles;
2. 在Update中执行JobSystem Schedule:
private void Update()
{
//Schedule the simulation job.
simulation.Schedule(Time.deltaTime);
}
3. 在LateUpdate中把RVO计算位置/选装结果设置给物体Transform:
if (m_orca.TryComplete())
{
if (m_AutoUpdateEntityTrans)
{
RVOAgent agent;
for (int i = 0; i < m_agents.Count; i++)
{
agent = m_agents[i];
agent.CachedTransform.position = agent.pos;
agent.CachedTransform.rotation = agent.rotation;
}
}
}
使用URP默认渲染 + Burst加速的Jobs RVO后,5千数量级帧数比之前多线程提高了20帧左右。
使用自定义Batch Renderer Group合批:文章来源:https://www.toymoban.com/news/detail-713083.html
主要是获取所有RVO Agent的位置和方向,使用JobSystem并行把这些位置和方向信息写入Batch Renderer Group的矩阵列表,这样就完成了并行将RVO的位置/方向同步到合批渲染的海量物体:文章来源地址https://www.toymoban.com/news/detail-713083.html
using Nebukam.ORCA;
using System;
using Unity.Burst;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Jobs;
using Unity.Mathematics;
using Unity.Transforms;
using UnityEngine;
using UnityEngine.Rendering;
namespace BRG
{
public class PlayerRenderGroup : MonoBehaviour
{
public Mesh mesh;
public Material material;
public ORCASetupRing orcaTest;
private BatchRendererGroup m_BRG;
private GraphicsBuffer m_InstanceData;
private BatchID m_BatchID;
private BatchMeshID m_MeshID;
private BatchMaterialID m_MaterialID;
// Some helper constants to make calculations more convenient.
private const int kSizeOfMatrix = sizeof(float) * 4 * 4;
private const int kSizeOfPackedMatrix = sizeof(float) * 3 * 4;
private const int kSizeOfFloat4 = sizeof(float) * 4;
private const int kBytesPerInstance = (kSizeOfPackedMatrix * 2) + kSizeOfFloat4;
private const int kExtraBytes = kSizeOfMatrix * 2;
[SerializeField] private int kNumInstances = 20000;
[SerializeField] private int m_RowCount = 200;
private NativeArray<float4x4> matrices;
private NativeArray<float3x4> objectToWorldMatrices;
private NativeArray<float3x4> worldToObjectMatrices;
private float4[] colors;
p
到了这里,关于【Unity】十万人同屏寻路? 基于Dots技术的多线程RVO2避障的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!