Unity - SRP Batcher:提升您的渲染性能

在2018年,Unity引入了一种高可定制的渲染技术,称之为Scriptable Render Pipeline(SRP)。

其中一部分是一个名为SRP Batcher的新底层渲染路径,它可以在渲染过程中提升渲染性能1.2~4倍。

 

取决于使用场景,官方提供了一个视频,让我们来看看:

https://youtu.be/pUM7ifjGKkM

视频请自行爬楼梯观看

 

以上视频展示了Unity的最坏情况:每个对象都是动态的,并使用不同的材质(颜色,纹理);场景显示了许多相似的Mesh,但每个对象使用一个不同的Mesh(因此不能使用GPU Instance技术); 结果:在PS4上性能提升4倍

 

Unity 和 Materials(材质)

Unity编辑器是非常灵活的渲染引擎,我们可以在运行期间随时修改材质属性。

Unity历史上是基于--非常量缓冲区(non-constant buffers)的,支持如DirectX9这种图形API。

所以, 当渲染使用了新材质时,这就需要大量的准备工作;即:在场景中拥有的材质越多,CPU提交给GPU的数据也越多。

Unity - SRP Batcher:提升您的渲染性能_第1张图片

标准Unity渲染流程

在Unity内部渲染路径中,当检测到新材质时,CPU会收集所有属性并在GPU内存中设置不同的常量缓冲区。 GPU缓冲区的数量取决于Shader如何声明其CBUFFER。

 

SRP Batcher 的工作原理

如果我们使用SRP技术,我们需要关心并写一些引擎底层代码。我们能原生地集成一些新的范式 - 比如GPU的数据管理(生命权);目标是由大量不同材质、但Shader变体较少的场景下,提升渲染性能。

如下,底层渲染路径可以让材质数据在GPU中持久存在。如果材质没有发生变化的话,则无需设置缓冲区并将其上传到GPU。此外,可以使用专用代码快速更新指定数据至大量的GPU-Buff上。新的流程图是这样的:

 

Unity - SRP Batcher:提升您的渲染性能_第2张图片

SRP Batcher 渲染流程

 

这里,CPU只处理内置的引擎属性,比如基本转换矩阵,所有的材质被托管至GPU的CBuffer上,随时可以被调用;

性能提升来自于:

1、所有材质数据都被托管至GPU内存中

2、每个对象的基础数据(例如Position/Scale/Rotation...) 被托管至GPU CBuffer中

 

【未完待续】

 

你可能感兴趣的:(Unity开发)