Unity 性能优化 之 非常酷的SRP Batcher!
概述
做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!相关推荐
- Unity性能优化 :合批篇
前言 本系列为一些性能优化的小知识,是日常游戏开发中与性能表现的一些点,本篇为该系列文章的第二篇,前篇链接: 第一篇: Unity性能优化:资源篇 在早期Unity中,对于合批的处理手段主要是下面三种 ...
- Unity性能优化分析思路
1)Unity性能优化分析思路 2)Unity2020后Paticle子节点旋转并把ScalingMode设置为Hierarchy后,对根节点进行缩放时表现不正常 3)FBX默认会冗余lit.mat ...
- Unity性能优化 – 脚本篇
最近开始进行Unity性能优化的工作,主要分为三类:CPU.GPU和内存.由于我们游戏的核心战斗是计算密集型,所以主要是受限于CPU.CPU的优化又分为渲染和脚本,本文将着重于脚本优化. 一般来说,优 ...
- Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
http://www.cnblogs.com/alan777/p/6135703.html Unity性能优化(2)-官方教程Diagnosing performance problems using ...
- 【Unity性能优化】静态资源优化——Audio优化
文章目录 写在前面 1. 前言 2. 使用Asset Checker进行资源检测 3. Audio优化 3.1 启用Force to Mono 3.2 压缩格式与采样率 3.3 音乐加载类型 3.4 ...
- Unity 性能优化:资源篇
Unity性能优化 大的方面来说,通过Unity对于项目的性能优化大概可以分为下面几个部分: 资源 渲染 程序 项目配置 而在这个部分中,资源的性能优化属于最基础.最有效的优化手段,也是游戏开发者日常 ...
- Unity 性能优化(力荐)
开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. ...
- Unity性能优化之编辑器检查——贴图
优化选项 图片资源一般可做如下优化设置 打包图集 mipmap不必要时选择关闭 Read/Write Enabled不必要时关闭 纹理压缩 图集打包的可以参考Unity性能优化之图集打包:mipmap ...
- Unity性能优化---音频
Unity性能优化-音频 摘自–传送门 向unity导入音频时,会默认将音频文件压缩为"Decompress On Load"&"Vorbis",如下图 ...
- Unity - 性能优化 - 包体,内存 - 偏静态资源的优化
文章目录 静态资源优化 - AssetPostprocessor Texture 压缩 Model 网格.动画 压缩 音频压缩 纹理的优化经验 尺寸 通道 发布出来的包资源再次分析 如何工具快速定位静 ...
最新文章
- 华为 S5700S-28P-LI Console连接电脑
- CVPR 2022 | 南开程明明团队和天大提出LD:目标检测的定位蒸馏
- 报名 | 清华大学海外学者短期讲学:数字经济创新创业课程
- 我必须分享给大家的 Git 资源汇总
- hertz接触理论_角接触轴承的组配和预紧技术及影响
- android p官方铃声,Android 铃声播放
- 【备忘录】sublime text的使用
- 编译原理(龙书):第五章部分题目参考答案
- 测试显卡矿卡用什么软件,3分钟看懂:AMD二手矿卡简明鉴别、检测教程,从此脱坑不求人...
- Visual Paradigm 如何清除系统代理设置
- PlantCV中文文档
- vscode+svn
- matlab 二次不等式约束,请教高手如何用matlab解多元二次不等式的解,有三个未知数x1,x2,x3,约束条件如下:...
- python安装包问题小结
- 图形界面介绍Violation Browser
- 输入汉字转自动转拼音 20378个词库
- 使用 MEAN 进行全栈开发基础篇——2、弄一个简单的用户管理试试
- 定义监听器的三种方法
- 用 python 实现简单AI 双人日麻(文字版)之三 加入COM出牌
- 刘轩-心理学-十点课-如何克服拖延症
热门文章
- Linux实战(9):Docker一键搭建kms服务
- oracle 获得节假日,Oracle 计算两个日期间时间排除非工作日及非工作时间
- unity素材三:未来城市场景
- Java +Vue 实现滑动拼图验证码(Java篇 )
- 计算机无法进入pe系统,u盘启动盘无法进入pe解决方法
- python读取svg转emf_ppt矢量图标,SVG转换EMF方法
- JAVA循环嵌套 方法的定义与重载 数组 数组异常 练习
- 管家婆设计页面用什么做的_管家婆软件主要是用来做什么的?
- JDK8的下载和安装,以及配置环境变量
- Charles破解安装