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

这篇具有很好参考价值的文章主要介绍了【Unity】十万人同屏寻路? 基于Dots技术的多线程RVO2避障。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

博文介绍了最基本的实现原理,有些老板懒得折腾,所以特意熬了几个秃头的夜把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合批:

主要是获取所有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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 万人寻路(dots版本)

    时间:2023-7-29 北京下雨,公司停电,回家早了,更新一下。 寻路模块,还是前前后后,打磨了2个月,中间穿插着搞很多其他的功能,有些螺旋迭代的味道。 进入正题: 设计团队,会从游戏性角度考虑,提出很多需求。 1,单位之间的规避,模型不能穿插 2,建筑物规避,模

    2024年02月08日
    浏览(39)
  • Unity 多相机 同屏显示

    一 首先了解: 相机和Canvas 的渲染先后关系 什么是相机的 渲染顺序 ? 答:简单理解就是 用毛刷  刷墙面,先刷的,会被后刷的 挡住 。 列如:相机01: 先渲染的大海,相机02:后渲染的比基尼美女。那么呈现的效果就是:比基尼美女站在大海前面。 毛刷理解方式:一面空

    2024年02月16日
    浏览(34)
  • DOTS介绍+Unity DOTS-MAN小游戏项目实战

    DOTS是Unity在17年左右提出的一个概念,其核心是ECS。 提示:以下是本篇文章正文内容,下面案例可供参考 全称:(Multi-Thread)Data-Oriented-Tech-Stack (多线程式)数据导向型技术堆栈 实体组件系统(ECS) - 提供使用面向数据的方法进行编码的框架。在Unity中它通过Entities软件包进行分发,

    2023年04月13日
    浏览(41)
  • Unity DOTS技术

    目录 一.概述 二.DOTS详解 1.开发环境搭建 2.简单ECS程序  2.调试功能 3.常用API  4.系统之间的互相干扰 5.实体Entity的创建查找删除 6.使用批处理Gpu Instancing优化性能 7.World,System,Group 1)World 2)System 3)Group 8.组件Component介绍 1)组件Component的添加修改删除 2)ShareComponent 3)状态

    2024年02月05日
    浏览(47)
  • Unity Dots学习内容记录

    DOTS未来的潜力还是挺多的,目前已经陆续有项目局部投入该技术,追求硬件到软件的极致性能。 主要是记录下学习unity dots技术的过程吧。 DOTS全称Data Oriented Tech Stack,面向数据的技术堆栈。 是由Unity的下面几个技术栈组成 1.Entities(ECS,Entity-Component Data-System) 2.JobSytem(多线程作

    2024年04月15日
    浏览(52)
  • Unity DOTS1.0安装

    2023年6月10日更新: 2022.3 Entities1.0 manifest.json添加一句

    2024年02月15日
    浏览(36)
  • Unity DOTS从原理到应用

    什么是DOTS? Unity的DOTS(Data-Oriented Technology Stack)是一种数据驱动的技术堆栈,旨在提高Unity游戏引擎的性能和可伸缩性。它使用C# Job System,Burst Compiler和Entity Component System(ECS)来组合和处理数据,让游戏运行更高效率。DOTS使开发人员可以使用最新技术来开发游戏,并在追求

    2024年02月11日
    浏览(42)
  • Unity项目技术方案Dots架构方案简介

    DOTS全称是Data-Oriented Tech Stack,翻译过来就是多线程式数据导向型技术堆栈(DOTS),它由任务系统(Job System)、实体组件系统(ECS)、Burst Compiler编译器三部分组成。 ECS + JobSystem + BurstCompile = 高性能 + 多线程 +  编译层面优化 DOTS保证相同类型组件在内存中都是顺序排列,极大

    2023年04月09日
    浏览(45)
  • Unity DOTS Baking与Baker详解

    Unity DOTS Baking与Baker详解   最近DOTS终于发布了正式的版本, 我们来分享一下DOTS里面Baking 与Baker的关键概念,方便大家上手学习掌握Unity DOTS开发。   Unity DOTS开发模式,为了让大家在”创作”游戏的时候使用原来组件方式来编辑游戏场景与资源,同时Unity提供了一种Baking机制

    2024年04月17日
    浏览(37)
  • Unity DOTS物理引擎的核心分析与详解

    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们来给大家分享和介绍一下这个物理引擎的使用。 Unity.Physics的设计哲学 Unity.Physics是基于DOTS设计思想的一个高性能C#物理引擎的实现, 包含了物理刚体的迭代计算与碰撞检测等查询。Unity.Phy

    2024年01月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包