概述

做Unity性能优化,减少Draw Calls是最头疼的事。

既然用到了URP管线,那么在做渲染优化的时候,就需要针对URP管线做相应的优化。

今天发现了除了动态batching和静态batching以外的一个非常酷炫的batching,那就是SRP Batching。

因为动态batching限制较多,包括模型顶点不能超过300个,shader的顶点属性不能超过900个(假如你的vertex shader用到了vertex position,normal,一个uv,那300个顶点*3 = 900,这样计算的),并且材质和贴图得必须一致,还不能用材质的copy等等。

其中模型顶点数量限制这个就很无解了,我们项目的模型顶点动辄就超过500到一千,那么做动态batching就是天方夜谭。

但是draw calls数量太多了,还是得想办法呀。皇天不负有心人,终于让我发现了SRP Batching。

这是我没有做SRP Batching之前,在Frame Debugger的状况:

我的天,单单是渲染阴影就用了100个draw calls。

甚至还提示无法batching的原因是:

"Dynamic Batching is turned off in Player Settings or is disabled temporarily in the current context to avoid z-fighting".

一头雾水的报错,因为pipelineAsset里确实勾选了Dynamic Batching。不过放心,下面的SRP Batching会解决这个问题。

渲染Opaque(不透明物体)13个。

渲染Transparents(半透明物体)93个!总共100+13+93 = 206个draw calls!

SetPass calls到达196。

具体实现

首先在Pipeline Asset里勾选SRP Batcher。

接着,得让我们的shader是SRP compatible(符合SRP的)的。

前提是我们修改的shader是支持URP管线的,具体怎么让shader支持URP管线可以参阅我之前的博客。

非常重要的步骤就是加入CBUFFER,例如:

CBUFFER_START(UnityPerMaterial)
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _Color;
CBUFFER_END

UnityPerMaterial的意思是在 Properties大括号里声明的所有变量,如下方的_Color和_MainTex变量:

Properties
{_Color("与主贴图正片叠底的颜色", Color) = (1,1,1,1)_MainTex("主贴图", 2D) = "white" {}
}

所以注意,不要加入Properties以外的属性变量。否则会报

"unitypermaterial var is not declared in shader property section"的错。

一般加入CBUFFER,并生效的话,SRP就compatible了。

然后我们来打开Frame Debugger来看看Batching的情况:

我的天,Transparents(半透明物体)的draw calls从93个跌到了11个!简直是魔法!

渲染Opaque(不透明物体)的从13跌倒了2个!

ShaderCaster阴影的SRP Batching

如果你的shader有用到ShaderCaster来实现阴影的话。以下的代码可以直接用来使阴影的SRP Batching生效。

pass {Name "ShadowCast"Tags{ "LightMode" = "ShadowCaster" }HLSLPROGRAM#pragma vertex ShadowPassVertex#pragma fragment ShadowPassFragment#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"CBUFFER_START(UnityPerMaterial)CBUFFER_ENDstruct Attributes{float4 positionOS   : POSITION;float3 normalOS     : NORMAL;};struct Varyings{float4 positionCS   : SV_POSITION;};Varyings ShadowPassVertex(Attributes input){Varyings output;float3 positionWS = TransformObjectToWorld(input.positionOS.xyz);float3 normalWS = TransformObjectToWorldNormal(input.normalOS);float4 positionCS = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, _MainLightPosition.xyz));output.positionCS = positionCS;return output;}half4 ShadowPassFragment(Varyings input) : SV_TARGET{return 0;}ENDHLSL
}

同样打开打开Frame Debugger来看看Batching的情况:

我的天,draw calls从100个跌到了10个!酷毙了!

最终,SetPass calls从196优化到109个。

参考文章:

https://zhuanlan.zhihu.com/p/137455866

https://zhuanlan.zhihu.com/p/156858564

https://blogs.unity3d.com/2019/02/28/srp-batcher-speed-up-your-rendering/

Unity 性能优化 之 非常酷的SRP Batcher!相关推荐

  1. Unity性能优化 :合批篇

    前言 本系列为一些性能优化的小知识,是日常游戏开发中与性能表现的一些点,本篇为该系列文章的第二篇,前篇链接: 第一篇: Unity性能优化:资源篇 在早期Unity中,对于合批的处理手段主要是下面三种 ...

  2. Unity性能优化分析思路

    1)Unity性能优化分析思路 ​2)Unity2020后Paticle子节点旋转并把ScalingMode设置为Hierarchy后,对根节点进行缩放时表现不正常 3)FBX默认会冗余lit.mat ...

  3. Unity性能优化 – 脚本篇

    最近开始进行Unity性能优化的工作,主要分为三类:CPU.GPU和内存.由于我们游戏的核心战斗是计算密集型,所以主要是受限于CPU.CPU的优化又分为渲染和脚本,本文将着重于脚本优化. 一般来说,优 ...

  4. Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译

    http://www.cnblogs.com/alan777/p/6135703.html Unity性能优化(2)-官方教程Diagnosing performance problems using ...

  5. 【Unity性能优化】静态资源优化——Audio优化

    文章目录 写在前面 1. 前言 2. 使用Asset Checker进行资源检测 3. Audio优化 3.1 启用Force to Mono 3.2 压缩格式与采样率 3.3 音乐加载类型 3.4 ...

  6. Unity 性能优化:资源篇

    Unity性能优化 大的方面来说,通过Unity对于项目的性能优化大概可以分为下面几个部分: 资源 渲染 程序 项目配置 而在这个部分中,资源的性能优化属于最基础.最有效的优化手段,也是游戏开发者日常 ...

  7. Unity 性能优化(力荐)

    开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. ...

  8. Unity性能优化之编辑器检查——贴图

    优化选项 图片资源一般可做如下优化设置 打包图集 mipmap不必要时选择关闭 Read/Write Enabled不必要时关闭 纹理压缩 图集打包的可以参考Unity性能优化之图集打包:mipmap ...

  9. Unity性能优化---音频

    Unity性能优化-音频 摘自–传送门 向unity导入音频时,会默认将音频文件压缩为"Decompress On Load"&"Vorbis",如下图 ...

  10. Unity - 性能优化 - 包体,内存 - 偏静态资源的优化

    文章目录 静态资源优化 - AssetPostprocessor Texture 压缩 Model 网格.动画 压缩 音频压缩 纹理的优化经验 尺寸 通道 发布出来的包资源再次分析 如何工具快速定位静 ...

最新文章

  1. 华为 S5700S-28P-LI Console连接电脑
  2. CVPR 2022 | 南开程明明团队和天大提出LD:目标检测的定位蒸馏
  3. 报名 | 清华大学海外学者短期讲学:数字经济创新创业课程
  4. 我必须分享给大家的 Git 资源汇总
  5. hertz接触理论_角接触轴承的组配和预紧技术及影响
  6. android p官方铃声,Android 铃声播放
  7. 【备忘录】sublime text的使用
  8. 编译原理(龙书):第五章部分题目参考答案
  9. 测试显卡矿卡用什么软件,3分钟看懂:AMD二手矿卡简明鉴别、检测教程,从此脱坑不求人...
  10. Visual Paradigm 如何清除系统代理设置
  11. PlantCV中文文档
  12. vscode+svn
  13. matlab 二次不等式约束,请教高手如何用matlab解多元二次不等式的解,有三个未知数x1,x2,x3,约束条件如下:...
  14. python安装包问题小结
  15. 图形界面介绍Violation Browser
  16. 输入汉字转自动转拼音 20378个词库
  17. 使用 MEAN 进行全栈开发基础篇——2、弄一个简单的用户管理试试
  18. 定义监听器的三种方法
  19. 用 python 实现简单AI 双人日麻(文字版)之三 加入COM出牌
  20. 刘轩-心理学-十点课-如何克服拖延症

热门文章

  1. Linux实战(9):Docker一键搭建kms服务
  2. oracle 获得节假日,Oracle 计算两个日期间时间排除非工作日及非工作时间
  3. unity素材三:未来城市场景
  4. Java +Vue 实现滑动拼图验证码(Java篇 )
  5. 计算机无法进入pe系统,u盘启动盘无法进入pe解决方法
  6. python读取svg转emf_ppt矢量图标,SVG转换EMF方法
  7. JAVA循环嵌套 方法的定义与重载 数组 数组异常 练习
  8. 管家婆设计页面用什么做的_管家婆软件主要是用来做什么的?
  9. JDK8的下载和安装,以及配置环境变量
  10. Charles破解安装