本页文本尚未补全
目标
本页内容的目标是减少渲染时draw call的开销。
draw call是CPU向GPU发送渲染指令的过程,每渲染一个物体就要进行一次,是造成卡顿的原因之一。
在上一页我们设置了自定义渲染管线的基础上,本页将尝试两种方式,分别通过SRP Batching(静态批处理合并)和GPU Instance,减少开销。
减少的是DC次数吗?
就此文而言,减少的似乎是“实际开销”,静态法似乎并不能减少渲染次数。
准备工作
安装 com.unity.render-pipelines.core
在unity菜单栏中,找到Windows->Package Manager,在当前列表加载完成后,点击左上角加号,通过URL方式安装。
在弹出的输入区内输入com.unity.render-pipelines.core
。下略。
如果未能正确设置此package,将会出现:
通过复制其他项目内的文件,到当前项目中的方法,不可行。
SRP Batching法/静态Batching
这一方法是在GPU上缓存材质属性,这样它们就不必每次draw call都被发送。这既减少了必须进行通信的数据量,也减少了每次draw call CPU必须做的工作。但是这要求shader必须坚持严格统一的数据结构,即内存布局相同。
默认的材质是不支持这一方法的,如图所示:
创建着色器
创建着色语言
创建材质
一番操作后,我们的材质终于支持SRP Batching了。
修改渲染管线
- 回到自定义渲染管线类
myRenderPipeline
中。在构造函数中加入:
1 |
|
以允许合并渲染。
效果
上图是未开启的状态,下图开启了。
扩展:为什么默认是关闭的?
GPU Instance法
这一方法的原理是对多个具有相同网格的对象同时发出一个draw call。CPU收集所有对象的转换信息和材质属性,并将它们保存到数组中,然后一次发给GPU,GPU遍历所有的数据并按照提供的顺序将它们一一呈现。;
创建着色器
创建着色语言
创建材质
- 在新建材质的Inspector中,勾选
GPU Instance
利用GPU Instance的合并效果如下:
If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !