【Unity URP 小知识】SRP如何提升了性能

这篇具有很好参考价值的文章主要介绍了【Unity URP 小知识】SRP如何提升了性能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SRP如何提升了性能

渲染的原理

渲染过程,一般都是先设置各类状态(设置如何清除各种显卡中的帧缓冲,设置使用的Shader程序,设置要绘制的顶点数据(以及Shader中的顶点数据如何对应到这些顶点数据),设置要使用的Uniform变量,设置面剔除,设置深度缓冲、模板缓冲,Blend混合等等),然后调用DrawCall命令来绘制。

其中设置这些状态的过程Unity中就叫SetPassCall,而设置这些状态的命令的性能消耗是非常高的,特别是其中从内存传输数据到显卡内存中这些。

一、如何减少SetPassCall

既然SetPassCall这么耗性能,那么如何减少呢?在老版的Unity渲染流程中,可以发现有两大块可以节省很多性能:
1.在Shader使用中的很多Uniform变量,其实都是不变的(大部分时间),比如灯光那些(位置,方向,亮度之类的),相机的View矩阵、投影矩阵,以及自定义的一些也是很少变化的。这里的很少变化指的是,每一帧变化这种情况。
2.很多Uniform变量的数据只发生很小的改变,也要对这个整个Uniform进行重新设置数据。同时,Uniform变量本身也是有数量限制的。

鉴于以上原因,以OpenGL为例子,他提供了一种方法来优化上面的情况,即UBO(Uniform Buffer Object)对象与Uniform Block(Uniform块),在DX中或者Unity中叫常量缓冲区。
即可以上传一个全局的Uniform组合块,他们可以在各种Shader中通用,不用每渲染一个物体,就要设置一次这些Uniform的值,同时还提供了接口来修改这个块中的一部分值。

这样当渲染相同Shader的时候,将那些相同的Uniform变量组合到一起,就可以节省多次设置这些状态值的开销。
同时如果有部分值变化了,也可以通过只修改部分的接口,来提升整体的性能。

二、OpenGL中的UBO使用

1.设置块布局

由于硬件不同所以在构造uniform组合时,要明确规定这个组合的数据要如何分布,所以在Shader中要明确设置布局(这里是std140布局,默认的共享布局方式会导致不同的内存分布)。

layout (std140) uniform ExampleBlock
{
    float value;
    vec3  vector;
    mat4  matrix;
    float values[3];
    bool  boolean;
    int   integer;
};

这样在内存设置好对应的内存布局后,就可以映射到对应的显卡内存中。

2.创建并使用Uniform Buffer Object

代码如下(示例):

unsigned int uboExampleBlock;
glGenBuffers(1, &uboExampleBlock);
glBindBuffer(GL_UNIFORM_BUFFER, uboExampleBlock);
glBufferData(GL_UNIFORM_BUFFER, 152, NULL, GL_STATIC_DRAW); // 分配152字节的内存
glBindBuffer(GL_UNIFORM_BUFFER, 0);

这样就可以申请并设置对应的缓冲对象数据,然后去填充这个数据:

glBindBuffer(GL_UNIFORM_BUFFER, uboExampleBlock);
int b = true; // GLSL中的bool是4字节的,所以我们将它存为一个integer
glBufferSubData(GL_UNIFORM_BUFFER, 144, 4, &b); 
glBindBuffer(GL_UNIFORM_BUFFER, 0);

3.Shader与Uniform Buffer Object绑定

由于UBO可能有多个,Shader中的Uniform Buffer Block也可能有多个,所以需要一种方式来映射他们。OpenGL中使用绑定点的方式来映射。

UBO的绑定:

glBindBufferBase(GL_UNIFORM_BUFFER, 2, uboExampleBlock); 
// 或
glBindBufferRange(GL_UNIFORM_BUFFER, 2, uboExampleBlock, 0, 152);

对应Shader中的绑定

unsigned int lights_index = glGetUniformBlockIndex(shaderA.ID, "Lights");   
glUniformBlockBinding(shaderA.ID, lights_index, 2);

这样Shader中的Uniform Buffer Block就知道去哪一个UBO去取数据了,且已经分配好布局,能搞正常拿到对应的数据。

4.修改部分数据

如果我们想只修改其中的一部分数据,我们可以

glBufferSubData(GL_UNIFORM_BUFFER, 144, 4, &b);

来修改一个UBO中的一部分数据。

总结

Unity使用SRP时,对我们封装了上面类似OpenGL的一大串功能设置及相关功能,且做到各个平台兼容。SRP Batch就是利用全局的数据缓冲的方式,以及局部修改的方式,来帮助提高渲染性能。文章来源地址https://www.toymoban.com/news/detail-533371.html

到了这里,关于【Unity URP 小知识】SRP如何提升了性能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity知识记录--项目升级URP

    URP是指Unity的通用渲染管线,此处主要针对原有项目进行升级使用,但并不是所有的内容都可以直接通过升级完成,直接使用的Unity默认的shader通常可以完成直接升级,自己编写的shader通常需要重做。 首先我们先要安装这个Package,打开Package Manager。   找到我们的URP这个packa

    2024年02月08日
    浏览(24)
  • Unity URP渲染管线与内置渲染管线的性能差别

    首先,我们来了解一下Unity的内置渲染管线。内置渲染管线是Unity较早版本中使用的默认渲染管线,它使用的是传统的图形渲染技术。内置渲染管线提供了一系列的渲染功能,如阴影、反射、抗锯齿等。但是,由于其较为庞大且复杂的设计,它的性能相对较低。在高质量图形效

    2024年02月08日
    浏览(28)
  • Unity中URP下实现能量罩(性能优化 和 BRP适配)

    在之前的文章中,我们实现了URP下的能量罩效果。 Unity中URP下实现能量罩(扭曲流光花纹) 我们在这篇文章中,对其进行性能优化 和 BRP下的适配。 我们这里把 能量罩花纹纹理 和 抓屏扭曲纹理 合并成同一个来使用,在效果上没多大变化。但是,可以少使用一次纹理采样。

    2024年02月01日
    浏览(43)
  • 如何扩展Unity URP的后处理Volume组件

    Unity在更新到Unity2019.4之后,大家或许已经发现,在使用URP(通用渲染管线)的情况下,Unity原来的Post Processing插件好像不起效了。 原来Unity在Unity2019.4之后在URP内部集成了屏幕后处理的功能,使用方法也很简单,直接在Hierachy视图右键,选择Volume/Global Volume,我们就可以在Hie

    2024年02月16日
    浏览(38)
  • 【Unity SRP】实现基础的Temporal AA(未完)

    写在前面 【技术美术图形部分】简述主流及新的抗锯齿技术,花了点时间盘点了一些主流AA技术,再在SRP下的URP管线中实现一下目前游戏用得比较多的TAA。参考Unity的TAA(比较容易懂)以及sienaiwun的实现思路,也参考了很多文章(主要是这位大佬),可以说这次实现其实是对

    2024年02月10日
    浏览(38)
  • Unity3D:提升场景画面品质&平衡性能优化

    在日常开发中,提升场景画面品质的同时平衡性能优化一直是很重要且头疼的一部分,尤其是当场景类型不同及效果需求不一样时。 所以怎么同时提升场景画面品质和平衡性能优化呢,下面介绍一些适用度高且实用性好的设置。 介绍之前先说一下结论:怎么样才能说的上是

    2024年02月08日
    浏览(34)
  • Unity GPU Skinning Tool: 提升3D游戏动画性能的新利器

    项目地址:https://gitcode.com/ForeverZack/Unity-Gpu-Skinning-Tool 在Unity引擎的世界里,Unity GPU Skinning Tool是一个强大的工具,它将骨骼动画计算从CPU转移到GPU,显著提高了游戏中的角色动画性能。对于那些需要大量3D角色与复杂动画的游戏开发者而言,这是一个非常值得尝试的技术。 Un

    2024年04月25日
    浏览(41)
  • Unity填坑-灯光烘焙相关

    项目组对灯光烘焙那块参数以及工作流程有一定疑问,单独抽时间把整个机制做了一次单独的调研,错漏之处恳请指点。 Unity中的Light模式分为三种: 实时,混合,烘焙。 这三种要结合在Lighting设置一起工作来看。 一种是直接光照,即光直接照到物体上,反射到相机里。 二

    2024年01月16日
    浏览(29)
  • 【Unity 踩坑系列】项目升级URP/HDRP渲染管线时如何解决材质丢失问题 (模型全部为粉红色)

    在我们创建项目时候如果我们一开始使用的是默认内置渲染管线,后期项目需要升级到URP或者HDRP渲染管线时有可能会出现预制体材质丢失的问题(原因是大部分资源的预制体在Unity官方推荐使用URP渲染管线之前,都只是使用默认内置管线的材质。所以并不适配现在的URP渲染管

    2024年02月16日
    浏览(40)
  • 【Unity URP】URP Camera使用及动态设置

    官方文档:   摄像机 | Universal RP | 12.1.1 https://docs.unity3d.com/cn/Packages/com.unity.render-pipelines.universal@12.1/manual/cameras.html 相机类型: Render Type(渲染类型) Base(基础相机):渲染到特定渲染目标的通用相机,场景中必须至少有一个。 Overlay(叠加相机):将其视图渲染在另一个摄

    2024年02月12日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包