图形学之路3:Draw Call优化

Posted by 秦浩凯(Haokai Qin) on 2022-03-20
Estimated Reading Time 2 Minutes
Words 603 In Total
Viewed Times

本页文本尚未补全

目标

本页内容的目标是减少渲染时draw call的开销。
draw call是CPU向GPU发送渲染指令的过程,每渲染一个物体就要进行一次,是造成卡顿的原因之一。

在上一页我们设置了自定义渲染管线的基础上,本页将尝试两种方式,分别通过SRP Batching(静态批处理合并)和GPU Instance,减少开销。

减少的是DC次数吗?

https://blog.csdn.net/n5/article/details/108312094

就此文而言,减少的似乎是“实际开销”,静态法似乎并不能减少渲染次数。

准备工作

安装 com.unity.render-pipelines.core

https://www.cnblogs.com/zitonglove/p/14998474.html

在unity菜单栏中,找到Windows->Package Manager,在当前列表加载完成后,点击左上角加号,通过URL方式安装。

在弹出的输入区内输入com.unity.render-pipelines.core。下略。

如果未能正确设置此package,将会出现:
failed package

通过复制其他项目内的文件,到当前项目中的方法,不可行。

SRP Batching法/静态Batching

这一方法是在GPU上缓存材质属性,这样它们就不必每次draw call都被发送。这既减少了必须进行通信的数据量,也减少了每次draw call CPU必须做的工作。但是这要求shader必须坚持严格统一的数据结构,即内存布局相同。

默认的材质是不支持这一方法的,如图所示:
failed package

创建着色器

创建着色语言

创建材质

一番操作后,我们的材质终于支持SRP Batching了。
failed package

修改渲染管线

  1. 回到自定义渲染管线类myRenderPipeline中。在构造函数中加入:
1
2
3
4
5
6
7
8


public myRenderPipeline()
{
// TOTURIAL 2 Batching
GraphicsSettings.useScriptableRenderPipelineBatching = true;
}

以允许合并渲染。

效果

failed package

failed package

上图是未开启的状态,下图开启了。

扩展:为什么默认是关闭的?

GPU Instance法

这一方法的原理是对多个具有相同网格的对象同时发出一个draw call。CPU收集所有对象的转换信息和材质属性,并将它们保存到数组中,然后一次发给GPU,GPU遍历所有的数据并按照提供的顺序将它们一一呈现。;

创建着色器

创建着色语言

创建材质

  1. 在新建材质的Inspector中,勾选GPU Instance

利用GPU Instance的合并效果如下:
failed package


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 !