【Unity】合批处理和GPU实例化的底层优化原理(完)

【Unity】批处理和实例化的底层优化原理

  • URP
    • 1.基础概念
      • SetPassCalls
      • DrawCalls
      • Batches
    • 2.重要性排序
      • 既然如此为什么仍然要合批?
    • 3.unity主流的合批优化方案和优先级
        • Early-Z
        • 透明物体情况
    • 4.合批(小场景但是很复杂很多小物件刚需)
      • 合并纹理图集更改uv映射(共享材质)
      • 静态合批(一批次最多是64000顶点)
        • 刺客信条场景案例
      • 手动合批
      • 动态合批
      • GPU Instancing(256)
  • SRP
  • 其他

以下图片以及理解均来自b站up主:别看着我笑了。直达链接
侵权请联系我,第一时间删除!

看前须知渲染管线基本流程!!!!!!(games101前9课)

URP

URP 全称为 Universal Render Pipeline,即通用渲染管线。它是 Unity 引擎提供的一种轻量级、可定制的渲染管线。

1.基础概念

SetPassCalls

这是对drawcall的准备工作,CPU设置资源和改变内部设置的地方,称之为渲染状态(下面有Unity的状态图)。例如改变材质,是图形API消耗极大的操作。
在这里插入图片描述

  • Unity可设置渲染的状态

在这里插入图片描述
豆包解释:
在这里插入图片描述
在这里插入图片描述
渲染的目标就是:不要让渲染跳出Batch外,所以需要合批(合batch)。
在这里插入图片描述

DrawCalls

在这里插入图片描述

Batches

在这里插入图片描述

2.重要性排序

通过实验和例子发现,如果setpass相同的话(这里体现在更换材质),批次的多与少对渲染性能的优化其实是微乎其微的,甚至会更差。
在这里插入图片描述
这个例子更能看出区别,上面是合批优化的,下面是减少setpassCall的,可以发现前者虽然合批到了极致,但是后者只通过将不同的材质合批减少了一次setpassCall耗时就低于了前者,说明在渲染消耗的时间setpassCall是占大头的。
在这里插入图片描述

既然如此为什么仍然要合批?

既然合批之后的时间甚至不如不合批,那为什么我们还要去优化批次呢?
原因:unity可以识别一些简单的物体是否是相同的材质,并且自动合批,但是在大多数复杂的环境下unity在渲染的时候不能分辨哪些是同一个材质,只是在某些复杂场景下,比如动态物体较多、材质变体复杂等情况,可能无法完美做到所有相同材质物体都能高效合并,导致仍存在多次切换相同材质引发 SetPass Call 的情况,所以合批是为了让尽可能减少的切换到相同材质的情况导致多次调用 SetPass Call。

3.unity主流的合批优化方案和优先级

在这里插入图片描述

Early-Z

可以在渲染之前确定不透明物体是否要渲染,是否遮挡并且剔除。然而如果遇到半透明物体由于需要确定透明物体后面的材质,所以不可避免的需要切换渲染状态。

透明物体情况

左图勾选静态合批,如果没有红球,那么在profile页面确确实实看到了静态合批减少了2次DrawCall(显示在Static Batching栏中),而加上红球后,由于前面的透明物体的渲染必须先知道后面的物体是怎么渲染的才能渲染,所以前面和最后面的透明物体无法合批一同渲染,因此批次增加了3(2透明球,1红色球)。
在这里插入图片描述

4.合批(小场景但是很复杂很多小物件刚需)

本质:在这里插入图片描述

合并纹理图集更改uv映射(共享材质)

  • 如果多个模型相同或不同的物体(主要看Transform是不是静态的),材质不同,可以通过合并图集更改uv映射,来减少材质更换的次数。
  • !局限性:合并图集可能增加纹理内存占用,若纹理利用率低,会浪费内存;调整 UV 映射过程较复杂,尤其是模型结构复杂时,手动调整工作量大,还可能影响纹理映射效果;此外,如果模型材质有复杂的动态变化效果,这种方式可能无法很好地满足需求。

静态合批(一批次最多是64000顶点)

原理:仅仅一次处理!!!
在这里插入图片描述

  • 当使用的材质是多 Pass(一个渲染过程中执行多个渲染通道,比如一些复杂材质可能既要渲染基础颜色,又要渲染高光、阴影等,每个步骤算一个 Pass )时,静态批处理依然有效

  • 然而如果合并多个相同网格会增加CPU的内存,不合并又会增加渲染时间,up主给出的建议是合并不同模型相同材质的静态网格物体,不过我个人认为下面说法更正确。

  • 实际开发中要怎么权衡这种空间换时间的利弊呢?
    总结:
    1.合并相同且靠近的网格,但又不能过多。
    2.考虑平台对内存资源的紧张程度,以及优先性。例如CSGO需要高帧数那么应该在许可的范围内以空间换时间,而在移动平台等资源紧张的平台应该更关注CPU内存的使用。
    3.大型复杂场景对GPU压力大的情况下,尽可能利用CPU缓解压力。
    在这里插入图片描述

刺客信条场景案例

把一个大的模型拆分成多个小块,通过小块之间的不同组合,实现不同的形状,使用同一个材质对应的uv地段,再通过shader脚本的编写就可以达成宏达而完美的场景甚至不用切换材质!

手动合批

任何相对运动且相对静止的物体,都可以通过再unity中调用Mesh.CombineMeshes,或者在建模软件中给它合批了。
然而unity不能自主的剔除手动合批的物体,您需要自己剔除(cull)!
在这里插入图片描述

动态合批

是在CPU中处理的。
据说很鸡肋使用条件十分之苛刻,只能在很有限的范围内进行优化,甚至是负优化,HDRP甚至不支持。
在这里插入图片描述
然而动态合批能够很好的处理unity的粒子系统。
在这里插入图片描述

GPU Instancing(256)

GPU Instancing(GPU 实例化)是一种渲染技术,其原理核心在于高效地多次渲染相同的几何体(包括缩放),减少 CPU 与 GPU 之间的数据传输和渲染状态切换开销,以此提升渲染性能。

基本原理
传统渲染方式下,若要绘制多个相同的模型,每次绘制都需要 CPU 向 GPU 发送完整的模型数据(如顶点数据、纹理等)和渲染指令,这会产生大量的重复数据传输,而且每次绘制前都要进行渲染状态的设置和切换,消耗大量的时间。
GPU Instancing 则是一次性将模型的基本数据(如顶点数据、索引数据)发送到 GPU,同时将每个实例的差异化数据(如位置、缩放、旋转、颜色等)打包成一个实例数据数组也发送给 GPU。在渲染时,GPU 根据这些实例数据对同一个基本几何体进行多次绘制,每次绘制使用不同的实例数据,从而实现多个相同模型的高效渲染。

具体步骤:
1.顶点数据:定义了一个三角形的顶点数据。
2.实例数据:定义了每个实例的位置偏移量。
3.着色器代码:顶点着色器负责将实例的位置偏移量应用到顶点位置上,片段着色器则设置了每个实例的颜色。
4.渲染循环:在渲染循环中,使用 glDrawArraysInstanced 函数进行实例化渲染。
不使用于顶点少的网格的合批

SRP

SRP 全称为 Scriptable Render Pipeline,也就是可编程渲染管线。传统的渲染管线是引擎预设好的,开发者只能在有限范围内进行参数调整。而 SRP 允许开发者使用脚本来自定义渲染流程,从底层实现对渲染的精细控制。这意味着开发者能够根据项目的具体需求和目标平台,灵活地设计渲染算法和效果。

和别的管线的区别与关系?

组成部分

  • URP(Universal Render Pipeline):通用渲染管线,是 SRP 的一种实现,具有轻量级、易于使用和跨平台的特点,适合大多数类型的项目,尤其是移动游戏和独立游戏。
  • HDRP(High Definition Render Pipeline):高清晰度渲染管线,专注于提供高质量的渲染效果,支持先进的光照、阴影和后处理技术,适用于对画面质量要求较高的项目,如 AAA 级游戏和影视制作。
  • 自定义渲染管线:开发者可以根据自己的需求,完全从头开始创建自定义的渲染管线,实现独特的渲染效果和性能优化。

在这里插入图片描述

  • 由于我们说URP在不同材质的情况下除了打成图集之外一定会切换渲染状态从而增加SetPassCall。渲染状态(如材质、着色器、纹理、混合模式等)的切换需要 CPU 生成并提交大量渲染命令(如 SetPassCall),这些命令的生成和组织会消耗 CPU 资源,尤其是当状态切换频繁时。

所以引出SRP,SRP是通过可编辑的自定义程序来控制合批的,shader发生改变的时候才会增加setpasscall,当材质发生改变时,如果只是调整了材质的参数(如改变颜色、更换纹理贴图、调整粗糙度数值等),而没有更改所使用的 Shader 本身(即渲染逻辑未变),那么 Shader 就不会改变。例如在基于物理的渲染(PBR)Shader 下,可以创建出金属、木头、布料等不同材质,它们使用相同的 Shader 渲染逻辑,只是各自的颜色、粗糙度、金属度等参数不同 。只有当需要采用不同的渲染方式,比如从普通的漫反射渲染切换到基于光线追踪的渲染时,才会更换 Shader 。
上: URP
下: SRP
在这里插入图片描述

  • CPU 执行逻辑
    仅处理引擎属性:CPU 专注于更新物体变换等引擎属性,存入 Per Object large buffer。
    材质数据按需处理:只有当材质内容真正改变时,才触发材质数据的设置代码(“Only when material content change”),否则复用 GPU 内存中已有的材质 CBUFFER。
    何时会改变?
    左:URP
    右: SRP在这里插入图片描述

其他

来自hansu1佬

  • 避免过多的 UI 绘制:

在使用 Unity 的 UI 系统时,过多的 UI 元素可能导致 Draw Call 数量激增。可以通过合理布局、合并 UI 元素、减少透明度变化等方式来优化 UI 渲染。

  • 减少实时光照和阴影:

实时光照和阴影会增加 Draw Call,尤其是多个光源和动态阴影的情况下。尽量使用 烘焙光照 来替代实时光照,可以显著降低 Draw Call 数量。
-合并网格(Mesh Combining):

  • 如果场景中有多个使用相同材质的小型网格,可以在运行时将它们合并为一个较大的网格。这样可以减少需要渲染的物体数量,进而减少 Draw Call。
    例如,在 Unity 中可以使用 Mesh.CombineMeshes() 来合并多个网格。

博主认为作为一个初学者理解到此就足够面对面试的八股了,往后自行哔站看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42055.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当人类关系重构:从“相互需要”到“鹅卵石化”——生成式人工智能(GAI)认证的角色与影响

在数字化浪潮的席卷之下,人类社会正经历着前所未有的变革。人与人之间的连接方式、互动模式以及价值认同,都在悄然发生着变化。这一过程中,一个显著的现象是,人与人之间的关系逐渐从传统的“相互需要”模式,转变为一种更为复杂、多元且稳定的“鹅卵石化”结构。在此背景下…

ctfhow——web入门171~175

sql简介 web入门171 ——判断注入点: -1 union select 1,2,3 -- 其实在这之前可以先判断多少列,即 -1‘ group(order) by 3 -- group by用于将具有相同值的行分组成一个汇总行,可以查看是否报错确定列数 2&#x…

vue遗漏的知识点(动态组件.组件库的操作使用)

----动态组件&#xff08;vue2vue3通用&#xff09; <component :is"..."> 的作用 <component> 是 Vue 的内置组件&#xff0c;用于动态渲染其他组件。:is 属性 用于指定要渲染的组件。它的值可以是&#xff1a; 组件的名称&#xff08;字符串&#xf…

ip改变导致的数据库连接不上

前言 需要用到路由器&#xff0c;所以先把家里的路由器给拆了先用着。新的路由器到了之后&#xff0c;更换上新的路由器之后&#xff0c;调用到服务会有报错&#xff0c;记录一下更换路由器之后ip重新分配服务可能会报的错. 进一步可以看到有关网路在服务当中的影响。 正文 …

DeepSeek面试——模型架构和主要创新点

本文将介绍DeepSeek的模型架构多头潜在注意力&#xff08;MLA&#xff09;技术&#xff0c;混合专家&#xff08;MoE&#xff09;架构&#xff0c; 无辅助损失负载均衡技术&#xff0c;多Token 预测&#xff08;MTP&#xff09;策略。 一、模型架构 DeepSeek-R1的基本架构沿用…

基于HTML5的3D魔方项目开发实践

基于HTML5的3D魔方项目开发实践 这里写目录标题 基于HTML5的3D魔方项目开发实践项目概述核心技术实现1. 3D效果实现CSS3 3D变换魔方结构设计 2. 交互控制实现动画控制键盘控制触摸控制 技术难点与解决方案1. 3D变换控制2. 触摸体验优化3. 动画性能优化 项目收获总结项目展望 项…

23种设计模式-原型(Prototype)设计模式

原型设计模式 &#x1f6a9;什么是原型设计模式&#xff1f;&#x1f6a9;原型设计模式的特点&#x1f6a9;原型设计模式的结构&#x1f6a9;原型设计模式的优缺点&#x1f6a9;原型设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是原型设计模式…

【MATLAB例程】交互式多模型(IMM),模型使用:CV,CT左转、CT右转,二维平面,三个模型的IMM,滤波使用EKF。订阅专栏后可查看代码

简单的介绍:本文所述的代码实现了一种基于交互多模型(IMM)算法的目标跟踪仿真,适用于复杂运动目标(如匀速、转弯运动)的状态估计。代码通过三个运动模型(匀速CV、左转弯CT1、右转弯CT2)的协同滤波,动态调整模型概率,最终输出综合跟踪结果。代码包含完整的仿真数据生成…

搭建私人对外git空间

# 创建用户&#xff0c;指定不可登录的 Shell&#xff08;git-shell 或 /usr/sbin/nologin&#xff09; sudo adduser --system --shell /usr/bin/git-shell --group git # 验证用户配置 grep git /etc/passwd # 预期输出&#xff1a;git:x:998:998::/home/git:/usr/bin/git-s…

PHP中yield关键字的使用

PHP版本>5.5 原理&#xff1a;yield关键字会生成一个Generator类的对象&#xff0c;PHP通过Generator实例计算出下一次迭代的值&#xff0c;再次返回一个Generator对象并停止循环&#xff08;即循环一次执行一次&#xff09;。 理解&#xff1a;使用在for/foreach/while循…

Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建

本文将详细介绍如何在 Vue3 项目中集成 mxGraph 可视化库&#xff0c;并通过 WebSocket 实现画布元素的实时更新。适合有 Vue 基础的前端开发者学习参考。 一、技术栈准备 Vue3&#xff1a;采用 Composition API 开发mxGraph&#xff1a;JavaScript 流程图库&#xff08;版本 …

Linux目录及文件管理

目录 一.Linux目录基本结构 1.常见目录及其作用 二.常用文件处理命令 1.七类常见的linux的文件 2.cat&#xff08;查看文件内容&#xff09; 3.more(分页查看文件内容&#xff09; 4.less(分页查看文件内容&#xff09; 5.head&#xff08;从头部查看文件内容&#xff0…

电机控制常见面试问题(二十)

文章目录 一.整流电路绕组接法二.电机为什么需要转速器三.电机转矩产生原理四.电机控制中载波频率大小的确定五.开关周期 Tpwm 一.整流电路绕组接法 为了引出直流的输出&#xff0c;一定要在整流变压器的二次侧引出零线&#xff0c;所以二次侧绕组必须接成星形 一次绕组必须要…

arm之s3c2440的I2C的用法

基础概念 IC&#xff08;Inter-Integrated Circuit&#xff09;又称I2C&#xff0c;是是IICBus简称&#xff0c;所以中文应该叫集成电路总线。 IIC的总线的使用场景&#xff0c;所有挂载在IIC总线上的设备都有两根信号线&#xff0c;一根是数据线SDA&#xff0c;另一 根是时钟…

MyBatis-Plus(Ⅲ)IService详解

目录 一、逐一演示 1.save&#xff08;插入一条&#xff09; 结果 断言&#xff08;引入概念&#xff09; 2.saveBatch&#xff08;批量插入&#xff09; 结果 3.saveOrUpdateBatch&#xff08;批量插入&更新&#xff09; 结果 4.removeById&#xff08;通过id删除…

可视化图解算法:删除有序(排序)链表中重复的元素-II

1. 题目 描述 给出一个升序排序的链表&#xff0c;删除链表中的所有重复出现的元素&#xff0c;只保留原链表中只出现一次的元素。 例如&#xff1a; 给出的链表为1→2→3→3→4→4→5, 返回1→2→5. 给出的链表为1→1→1→2→3 返回2→3. 数据范围&#xff1a;链表长度 0≤…

23种设计模式-中介者(Mediator)设计模式

中介者设计模式 &#x1f6a9;什么是中介者设计模式&#xff1f;&#x1f6a9;中介者设计模式的特点&#x1f6a9;中介者设计模式的结构&#x1f6a9;中介者设计模式的优缺点&#x1f6a9;中介者设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

基于云服务器的数仓搭建-hive/spark安装

mysql本地安装 安装流程&#xff08;内存占用200M&#xff0c;升至2.1G&#xff09; # 将资料里mysql文件夹及里面所有内容上传到/opt/software/mysql目录下 mkdir /opt/software/mysql cd /opt/software/mysql/ # 待上传文件 install_mysql.sh mysql-community-client-8.0.3…

华为配置篇-ISIS基础实验

ISIS 一、简述二、常用命令总结三、实验 一、简述 一、基本定义与历史背景 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是一种链路状态路由协议&#xff0c;最初由ISO设计用于OSI&#xff08;开放系统互联&#…

Python 练习项目:MBTI 命令行测试工具

在当今数字化的时代,心理测试工具越来越受到欢迎,它们帮助人们更好地了解自己,做出更明智的职业选择,甚至改善人际关系。MBTI(迈尔斯-布里格斯性格分类法)是其中一种广为人知的人格测试,通过评估个人在四个维度上的偏好(外向-内向、实感-直觉、理智-情感、判断-理解),…