unity 性能优化之合批和剔除

这篇具有很好参考价值的文章主要介绍了unity 性能优化之合批和剔除。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

批次对渲染的性能影响是比较大的,批次过多会导致cpu提交的次数过多,导致每帧渲染时间过长,所以我们需要对其优化,减少Bathches数量和SetPassCall次数。
批次合并的方法有多种,下面一一列出:

手动合批

将相同材质的Mesh,合并为一个新的Mesh,这样一次渲染,最方便调节,虽然现在不怎么使用这种方式。就是有点费手,会增加内存和包体大小,而且会增加LightMap中占有的尺寸,以及重新制作LOD,并且体积过大了会导致LightProbe和ReflectionProbe的变化单一。相关插件:MeshBaker以及教程

静态合批 Static batching:

原理:

在非运行期间,自动计算Mesh合并后的顶点并转换到世界空间坐标系下,构建共享的顶点和索引缓冲区,在运行时将该数据上传到gpu。编辑器运行是在点击运行时编译,打包是会在build时打包在场景中。对于场景,每个静态物体没有实际的合并操作,还是单独的个体,在运行时,我们会发现它使用了一个合并的Mesh。运行时还是按照正常流程对每个物体进行剔除,排序,渲染操作。渲染单个物体时,每个渲染器组件调用Drawcall中仅包含三角形索引的偏移量和范围,因此速度非常快。静态合批不会减少Drawcall,而是减少了SetPassCall和数据提交的次数。简单的理解就是,静态合批只是改变了提交的内容,让多次提交变为了一次,而这些次的提交只是改变成了从那一次提交的内容里面拿数据渲染。

条件:

材质及shader参数要完全一致才能合批。LightMap,LightProbe,ReflectionProbe,多光源都需要一致,LightMap尽量增加尺寸推荐2k,其它的尽量禁掉,或者增大影响范围,共用一个。
合批是在世界空间下,如果使用了对象空间坐标,会出现错误。

优点:

合并操作是自动处理,没有污染,不会更改任何场景内的数据,对象可以单独进行剔除,LOD

缺点:

内存和包体占用增加,特别是大量重复的物体,树,草。每个批次最多包含65000个顶点,超出了会额外合并。

GPU Instancing

原理

GPU Instancing是将一个网格发送到GPU并使用一组变换矩阵和MaterialPropertyBlocks对其进行渲染。
当执行Instance合批时,会收集所有需要的信息(变换矩阵,材质属性块)创建一个按实例ID索引的数组。矩阵是存储的世界空间坐标系数据,如果每帧合批的物体有变动,那么每帧都需要付出性能进行数据重新生成。材质属性块则是用来可以自定义一些单独的属性(per-instance property),但是不支持纹理,需要额外的书写支持。实现方式在shader中需要写入常量缓冲区:

UNITY_INSTANCING_BUFFER_START(Props)
  UNITY_DEFINE_INSTANCED_PROP(float4, _Color)
UNITY_INSTANCING_BUFFER_END(Props)

我们需要将切换的属性写在UNITY_INSTANCING_BUFFER_START和UNITY_INSTANCING_BUFFER_END之间。然后还需要在程序上兼容,可以在调用 DrawMeshInstanced 时通过脚本手动构建,或者使用 MaterialPropertyBlock 在Renderer组件上设置。

几种实现方式

  1. 在材质球面板开启GPU Instance选项
    这种方式也是基本上常用的方式,也是一种自动化的GPU Instancing。勾选以后,即可实现了GPU Instancing合批,重要的是你的Shader一定要支持,unity内置的都支持。
    Unity会根据摄像机当前所见的物体,收集信息动态构件Constant Buffer(常量缓冲区),如果材质上的属性不同,我们还可以在shader上增加额外的一些属性,这些属性需要写在UNITY_INSTANCING_BUFFER中间。
  2. DrwaMeshInstanced
    这个需要使用代码实现控制GPU Instancing,能够一次绘制更多的物体,最多一次绘制1023个,这个主要取决于CBuffer的容量,Constant Buffer的最大容量只有64K。这种实例化方法同脚脚本管理一个持久的常量缓冲区(CBuffer),不会随着摄像机所见物体频繁更改CBuffer。因此能获得更好的cpu和gpu性能,代价就是占用一定的cpu内存。这种方式会绕开unity的渲染框架,因此每个模型无法应用剔除操作和LOD等功能。
  3. DrawMeshInstancedIndirect / DrawMeshInstancedProcedural
    官方文档点击此处,这种方法是通过COmputeBuffer来提供Instance数据,ComputeBuffer其实是StructureBuffer,容量可以比Constant Buffer大很多。因此这种方法可以绘制巨量的Instance。几何Compute Shader能够实现GPU Frustum Culling(GPU视椎体剔除)和Hi-z Occlusion Culing(Hi-z遮挡剔除),缺点是兼容性差,需要ShadingModel 4.5以上,支持Compute Shader 和 Compute Buffer的硬件特性。

实现条件

  1. 需要相同的Mesh
  2. 需要相同的材质
  3. Shader需要支持GPU Instancing

优势

  1. 不会因为物体的增加额外占用大量的内存。
  2. 适用于大量重复的物体,比如树,草,小石头等
  3. 支持per-instance property,自定义单个模型的属性

缺点

  1. 只能支持相同的Mesh
  2. LOD会打断GPU Instancing合批,静态的则不会,因为合并的时候,它已把LOD相关的合并在了一个模型内。

相关插件:GPU Instancer

SRP Batcher

原理

SRP是基于Shader进行的批处理,不需要Mesh和材质相同,它是实现了,减少每种材质切换时的设置也就是减少cpu和gpu之间的交互来实现性能优化。运行逻辑是在启动时,将网格上传到gpu,然后将使用SRP合批的材质主数据放入列表一次上传并在每帧更新时去更新列表中的数据。渲染时会对列表进行偏移获取数据渲染,主要起到了合并SetPassCall的作用。

实现条件

  1. 必须是一个Shader变体,同一个Shader变体,同样的宏,以及同样的队列同样的混合模式,深度检测写入等。
  2. Shader需要支持SRP,正常URP内书写的Shader,首先变量需要写到UnityPerMaterial中:
    unity 材质合批,unity,性能优化,游戏引擎
    如果你的shader支持SRP,能够在shader面板上查看到
    unity 材质合批,unity,性能优化,游戏引擎

优势

  1. 减少了数据的上传,不用每次都上传网格体
  2. 大大减少了cpu和gpu之间的通信
  3. 支持不同的材质,只要shader变体相同即可
  4. 支持Skining Mesh 骨骼模型

技术选型

  1. 静态物体还是推荐使用静态合批的方式。
  2. 如果大批量的相同材质相同模型的渲染使用GPU Instancing合批
  3. 骨骼模型只能使用SRP
  4. 其它的都使用SRP
  5. 如果材质支持SRP,即使设置了GPU Instancing也不会启作用,可以修改shader让其不支持

剔除

unity内置的剔除模式有:

  1. 视椎体剔除 相机看不到的地方剔除掉
  2. layerCullDistances 可以给不同的层级设置剔除距离
  3. 遮挡剔除 被其它模型遮挡住的模型剔除掉

unity商店不错的插件:

  1. Optimizers
  2. Scene Optimizer
  3. Frustum Culling
  4. Perfect Culling - Occlusion Culling System

同屏面数优化

对于静态模型,同屏面数主要影响GPU耗时
对于骨骼模型,模型面数会影响CPU骨骼动画或者布料模拟的耗时
在不影响游戏质量的情况下,尽可能将面数控制在可接受的最低范围。需要经验丰富模型美术同学在制作环节把关
相关插件:

  1. Poly Few | Mesh Simplifier and Auto LOD Generator
  2. Amplify Impostors
  3. Mesh Combine Studio 2

其它方面

其它我们还需要注意毕竟影响cpu和gpu交互的地方
光照,多Pass,实时阴影,平面反射,实时ReflectionProbe 多相机文章来源地址https://www.toymoban.com/news/detail-553696.html

到了这里,关于unity 性能优化之合批和剔除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Unity】渲染性能开挂GPU Animation, 动画渲染合批GPU Instance

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

    2024年02月05日
    浏览(34)
  • Unity - 搬砖日志 - UGUI合批优化 - Overlap(UI AABB 有重叠), Z != 0 照样合批的方案

    Unity : 2020.3.37f1 Pipeline : BRP (另一个项目在 2021.1.xx 的 LTS 下的 URP 管线同样如此,目测:因为 UGUI 不受渲染管线切换而变化) 便于索引,记录搬砖 可以看到,下图 Canvas 的 Render Mode 在使用: Screen Space - Overlay 模式下的DC为 8 这里导致合批失败的有两个问题: 图片显示有相互的

    2024年02月13日
    浏览(30)
  • 顶级工程师教你移动端游戏性能优化!Unity官方教程!

    ** 本期将给大家介绍如何提高资源、项目配置和图形的性能。所有教程均来自Unity官方,感兴趣的朋友可以去Unity官网查看完整教学内容。 降低或禁用 Accelerometer Frequency(加速度计频率) Unity每秒钟是会以一定次数统计移动设备的加速度计状态的。如果我们的程序不会用到加

    2024年02月20日
    浏览(35)
  • 材质合批,提高模型渲染效率

      模型材质合批是一种技术手段,主要用于优化渲染性能和提高图形应用程序的帧率。它通过将多个模型的材质进行合并,从而减少渲染时的绘制调用次数。   在计算机图形学中,每个模型都有一个或多个材质,这些材质定义了模型表面的外观特性,例如纹理、颜色、光

    2024年02月07日
    浏览(31)
  • 【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置

     GPU 3D骨骼动画和 GPU 2D Spine动画插件均包含在【万人同屏整合方案】中,老板们可在某宝搜:[游戏开发资源商店] 以获取全套方案的所有源码插件。 插件功能: 1. 支持3D动画转GPU动画  2. 支持2D Spine动画转GPU动画 3. 支持挂点、支持挂载物、动态切换挂载物、实时获取挂点T

    2024年01月18日
    浏览(34)
  • DOTS Instancing合批:如何针对单个渲染实体修改材质参数

      最近在做DOTS的教程,由于DOTS(版本1.0.16)目前不支持角色的骨骼动画,我们是将角色的所有动画数据Baker到一个纹理里面,通过修改材质中的参数AnimBegin,AnimEnd来决定动画播放的起点和终点,材质参数AnimTime记录当前过去的动画时间。但是在做大规模战斗控制的时候,有1000

    2024年04月10日
    浏览(25)
  • 【Unity】GPU骨骼 GPU Spine动画 2D/3D渲染性能开挂 合批渲染 支持武器挂载 动画事件 动画融合 实时获取骨骼位置

     GPU 3D骨骼动画和 GPU 2D Spine动画插件均包含在【万人同屏整合方案】中,老板们可在某宝搜:[游戏开发资源商店] 以获取全套方案的所有源码插件。   万人同屏渲染避障锁敌方案实现对抗战斗demo 展示GPU动画高级功能 动画事件 动画平滑过渡 融合   插件功能: 1. 支持3D动画

    2024年02月22日
    浏览(33)
  • unity游戏破解 修改粒子材质

    游戏汉化 遇到一个 比较文化差异的 问题  最近从google play 逆向一个杀人游戏 准备汉化 处理 其中游戏杀人的效果 血是红色的 那这时候小朋友的家长就要说了呀!!!!!! 哎呀  这游戏太血腥 太暴力啦 不行 不能让娃娃玩 !!!! 那没办法呀 改 改 改 首先呢 这血的效果

    2023年04月08日
    浏览(34)
  • 大数据Flink(五十二):Flink中的批和流以及性能比较

    文章目录 Flink中的批和流以及性能比较 ​​​​​​​​​​​​​​一、Flink中的批和流

    2024年02月15日
    浏览(31)
  • SuperMap Hi-Fi 3D SDK for Unity制作游戏引擎材质

    kele     在交通,电力,规划等行业中,有的对象常常具有很强的质感,比如金属质感的 钢轨,电力塔;陶瓷材质的绝缘子;玻璃材质的建筑幕墙等,但常规方式的表现效果 往往差强人意。     游戏引擎(Unity3D)中已有丰富的材质资源库,比如玻璃,金属等材质,这

    2024年02月09日
    浏览(75)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包