【Unity】万人同屏高级篇, 自定义BRG&dots合批渲染,海量物体目标搜索

2024-02-27 1391阅读

温馨提示:这篇文章已超过441天没有更新,请注意相关的内容是否还可用!

 博文介绍了最基本的实现原理,有些老板懒得折腾,所以特意熬了几个秃头的夜把RVO、BRG、GPU动画、海量物体目标搜索等高度封装成了开箱即用的插件。 划重点!!此方案是绕开Entities(ECS),不用写一行ECS代码,现有MonoBehavior开发工作流享受Entities渲染的性能。已有项目也能使用此方案开挂,无需代码重构!。Wechat: 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万人同屏海量物体合批渲染

Unity万人同屏海量物体目标搜索

海量单位高性能索敌攻击方案压测

移动端测试AOT和HybridCLR热更性能对比

博文开发测试环境:

  • Unity:Unity 2022.3.10f1,URP 14.0.8,Burst 1.8.8,Jobs 0.70.0-preview.7,热更HybridCLR 4.0.6
  • PC:Win11,CPU i7-13700KF,GPU 3070 8G,RAM 32G;
  • 移动端:Android,骁龙8 gen2,RAM 12G;

上篇博文通过最基本的自定义BRG(Batch Renderer Group) + RVO避障实现了10万人同屏动态避障:【Unity】十万人同屏寻路? 基于Dots技术的多线程RVO2避障_TopGames的博客-CSDN博客

 上篇博文的BRG功能并不完善,不支持多种Mesh和Material渲染,没有拆分渲染批次(Batch),没有裁剪(Culling)处理(即不会剔除相机视口外的物体)。并且没有根据渲染数量拆分多个Draw Command。

BRG代码写起来并不容易,此博文基于Unity中国DOTS技术主管开源的一个BRG示例工程修改,这里仅描述主要的实现原理:

参考文章:Unity Open Day 北京站-技术专场:深入理解 Entities Gr - 技术专栏 - Unity官方开发者社区

BRG示例工程:
https://github.com/vinsli/batch-renderer【Unity】万人同屏高级篇, 自定义BRG&dots合批渲染,海量物体目标搜索https://github.com/vinsli/batch-renderer

 另外也可以看看Unity官方BRG测试案例,官方案例是把当前已经创建的MeshRenderer禁用然后用BRG接管渲染:

https://github.com/Unity-Technologies/Graphics/tree/master/Tests/SRPTests/Packages/com.unity.testing.brg

 实现目标:

为了方便使用BRG功能,需要封装一个BatchRenderComponent脚本。不使用ECS,仅使用传统创建GameObject的方式与BRG无缝衔接,也就是对于海量物体不使用Unity Renderer组件,用封装后的BRG无感知接管物体的渲染,最大程度上不改变传统工作流的同时大幅提升性能;

其中GameObject是只有Transform组件的空物体,渲染由BatchRenderComponent接管,进行合批渲染。由于Transform只能在主线程使用,当数量级庞大时每帧修改Transform位置/旋转会导致掉帧,所以仅当这个GameObject挂载子节点(如,子节点包含特效,需要跟随人物移动)时才需要开启每帧同步Transform位置,这样可以大幅节省开销。

通过此方法可以完美绕开Entities(ECS),同时也绕开了Entities(ECS)对开发成本和效率影响,以及ECS当前不支持从文件名加载资源、不支持热更的痛点。

最终效果:

PC端5W人, AOT模式(不使用HybridCLR),开启阴影:

【Unity】万人同屏高级篇, 自定义BRG&dots合批渲染,海量物体目标搜索

Android端5K人,AOT模式(不使用HybridCLR),开启阴影:

【Unity】万人同屏高级篇, 自定义BRG&dots合批渲染,海量物体目标搜索

 Android端5K人, HybridCLR热更模式,开启阴影:

【Unity】万人同屏高级篇, 自定义BRG&dots合批渲染,海量物体目标搜索

测试中一帧创建1000个物体时会有明显卡顿,这是Unity实体化GameObject本身的性能问题,实际项目中海量物体的创建并不要求实时性,可以通过队列分散到多帧创建以解决卡顿。

 一,支持多Mesh/多Material

【Unity】万人同屏高级篇, 自定义BRG&dots合批渲染,海量物体目标搜索

 使用BRG必须开启SRP Batcher,  SRP支持相同Material合批。因此支持多Material就需要根据不同Material拆分Batch,针对不同Material使用多个Batch渲染。

每个物体需要向GPU上传以下数据:

  • 两个3x4矩阵,决定物体渲染的位置/旋转/缩放;
  • _BaseColor,物体混合颜色;
  • _ClipI
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]