【Unity】十万人同屏寻路? 基于Dots技术的多线程RVO2避障

本文介绍了一种无需ECS代码的Unity解决方案,利用Dots、Jobs System和Burst加速实现多线程RVO避障。作者提供了一个高度封装的插件,支持万人同屏动画人物的避障,并附带性能压力测试包和视频教程。通过使用Burst Job System和Batch Renderer Group,优化后的方案在5千人场景中提升了20帧左右的性能。
摘要由CSDN通过智能技术生成

  视频中万人同屏方案(gpu动画、渲染、索敌、避障等功能),可某宝搜【店铺】:【游戏开发资源商店】获取整套方案源码。

划重点!!此方案是绕开Entities(ECS),不用写一行ECS代码,现有MonoBehavior开发工作流享受Entities渲染的性能。已有项目也能使用此方案开挂,无需代码重构!

万人同屏对抗demo测试包下载,以及万人同屏方案性能测试,有需要的老板可以某宝【搜店铺】:【游戏开发资源商店】:https://pan.baidu.com/s/1ML0DC8s0RkkTAraN9maltw?pwd=blueicon-default.png?t=N7T8https://pan.baidu.com/s/1ML0DC8s0RkkTAraN9maltw?pwd=blue

 性能压力测试包自取:

 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合批:

主要是获取所有RVO Agent的位置和方向,使用JobSystem并行把这些位置和方向信息写入Batch Renderer Group的矩阵列表,这样就完成了并行将RVO的位置/方向同步到合批渲染的海量物体:

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 c
Unity多相机同屏Unity引擎的一种功能,它能够让用户在一个场景中使用多个相机,实现不同角度、不同距离的视角展示。这种技术在游戏开发中很常见,可以给玩家提供更具有丰富性的游戏体验。 Unity多相机同屏的原理是将多个不同的相机以同一画面进行呈现,每个相机都可以设置不同的位置、旋转和视角,从而实现不同的观察效果。在同一帧渲染时,Unity会将多个相机的画面进行合并,从而让多个画面形成一个完整的图像。 使用Unity多相机同屏可以带来很多好处,例如可以在游戏场景中创建多个摄像头,实现不同的画面展示效果,比如玩家死亡后可以切换到另一个摄像头显示续命等候的过程,或者在游戏场景中创建静态的建筑模型,使用多个相机展示,可以让玩家获得更好的三维感。 然而,多相机同屏也有一些需要考虑的问题,比如需要更好的图像合成技术,尤其是在相机交汇的区域,还需要考虑相机间的配合问题。因此,使用多相机同屏需要开发者具备较为深厚的开发经验和良好的技术水平。 总的来说,Unity多相机同屏是游戏开发中一个非常重要的功能,可以为玩家带来更加丰富的游戏体验。使用它需要开发者具备丰富的开发经验,更好的图像合成技术,严格控制相机的数量和位置,从而以更高的品质呈现游戏画面。
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值