当前位置: 首页 > news >正文

Unity Shader 学习17:合批渲染

一、基础概念

合批主要是针对这三个概念进行优化减少:

SetPass Call:一次渲染状态切换,也就是每次切换 材质/Pass 时,就会触发一次SetPass Call
Draw Call:cpu 调用一次 gpu 绘制函数
Batch:表示一组可以一起交给gpu的Draw Call

优化结果可以在 Game窗口-Stats 或 FrameDebugger 中查看。

二、4 种主要合批方式

1. 动态合批 (降低draw call)

cpu 快速  共享同一材质&pass 的多个模型合并为一个模型,再通过一次draw call绘制。
- 只有内置管线可用
- 适用于 小的、动态 物体,加起来不能超过900个float4顶点

- 实现:

确保设置中开启了动态合批,Unity会 自动进行合批。

2. 静态合批 (降低batch)

提前  着色器相同的静态物体 合并为一个模型,且预先进行坐标变换。
- 适用所有管线 
- 空间换时间
- 减少batch但不减少draw call

- 实现:

确保设置中开启了静态合批,之后Unity会对 标为Static的物体 自动进行合批。

3. GPU Instancing (降低draw call)

适用于 同一模型微小差异大批渲染,只提交一个mesh和材质,但提交所有实例的差异化信息,然后对同一个mesh在GPU中进行变换绘制。
- 适用所有管线 
- 完全相同的 Mesh & 材质,只有材质参数不同

- 实现:表面着色器

(1) 启用。
如果是完全一样的材质,直接勾选Material的Inspector面板中的 Enable GPU Instancing 选项即可,后面的两步都可以省略。

(2) 修改shader。
如果每个模型的材质属性有差异的话,就可以在表面着色器的以下部分的代码中设置有所差异的属性。

(3) 从cs脚本中为属性传入不同值。

eg:

- 实现:顶点片元着色器

流程和表面着色器基本一致,只是第二步中会稍微复杂一点。

(1) 启用。
同样是需要启用gpu instancing选项,但对于顶点片元这种着色器生成的材质面板上是没有该选项的,所以shader中需要添加使用instancing的变体

(2) 修改shader。

① 顶点着色器的输入输出结构中注册实例化ID;
② 设置有所差异的属性;
③ 顶点与片元着色器中,让其能访问结构体,并顺利传递。
④ 使用②中设置好的属性。

(3) 从cs脚本中为属性传入不同值。与表面着色器一致。


4. SRP Batcher (降低set pass call)

对使用同一材质/Pass不同模型,通过 减少无需更新的数据buffer的更新频次 来降低set pass call 进行加速。(将使用过的材质数据缓存到显卡中,之后再使用该材质就不需要重新从cpu再传数据了,直接用显卡中的数据)
- 只支持SRP
不减少draw call
- 如果本身的stepasscall占比就不高,主要的时间开销就是drawcall的话,使用这个方法的前后帧率提升就不明显

 --优化后->

- 实现:

(1) 将管线配置的inspector面板改为debug模式,然后勾选Use SRP Batcher。

(2) 【可选步骤】因为SRP Batcher只对相邻的渲染指令生效,所以要确保连续渲染。例如在我的卡渲那篇文章中,就通过RenderObjects将描边pass的渲染提取到连续的顺序来渲染,这样就为后续的合并提供了基础条件。

(3) 修改Shader变量:将pass中的变量用 CBUFFER_START(UnityPerMaterial)CBUFFER_END 包裹起来。如果是多pass的shader,还需要确保每个pass中的变量及其顺序是一致的。

如果修改正确,shader的inspector面板中就会显示SRP Batcher是compatible的,如果依然不符合标准,会显示not compatible并给出错误提示。

相关文章:

Unity Shader 学习17:合批渲染

一、基础概念 合批主要是针对这三个概念进行优化减少: ① SetPass Call:一次渲染状态切换,也就是每次切换 材质/Pass 时,就会触发一次SetPass Call ② Draw Call:cpu 调用一次 gpu 绘制函数 ③ Batch:表示…...

【JavaSE】抽象类和接口

【JavaSE】抽象类和接口 前言:补充知识 —— 利用类和对象,交换两个数字 一、抽象类1.1 抽象类是什么?1.2 抽象类特点1.3 抽象类举例1.4 抽象类作用 二、接口2.1 接口是什么?2.2 接口的特性2.3 接口的使用规则2.4 类可以实现多个接…...

嵌入式单片机程序的映像文件解读

映像文件类型 单片机下载程序的映像文件是包含了可执行代码、数据等信息,用于将程序烧录到单片机中的文件。常见的映像文件种类如下: 十六进制文件(Hex 文件) 格式特点:Hex 文件是一种文本格式的文件,以 ASCII 字符形式存储数据。它由一系列的记录组成,每条记录包含一个…...

在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服务器,并实现远程联机,详细教程

Linux 部署 MineCraft 服务器 详细教程(丐版,无需云服务器) 一、虚拟机 Ubuntu 部署二、下载 Minecraft 服务端三、安装 JRE 21四、安装 MCS manager 面板五、搭建服务器六、本地测试连接七、下载樱花,实现内网穿透,邀…...

STL之string

1.为什么学习string类 1.1 C语言中的字符串 C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且…...

cJSON-轻量级 C 语言 JSON 解析库的使用(一)

文章目录 cJSON:轻量级 C 语言 JSON 解析库的使用前言一、cJSON 简介核心特点: 二、核心数据结构解析三、深入解析 API 设计1. 解析 JSON2. 访问数据3. 构建 JSON 四、内存管理策略五、高级应用技巧1. 引用系统2. 批量操作3. 原地修改 六、性能优化技巧1…...

用Python和Stable Diffusion生成AI动画:从图像到视频的全流程指南

引言 本文将演示如何通过Python代码实现基于文本提示的AI动画生成。我们将使用Stable Diffusion生成连贯图像帧,结合OpenCV合成视频,最终实现一个可自定义的动画生成 pipeline。 一、环境准备 1. 依赖安装 # 安装核心库 pip install diffusers transformers torch numpy …...

C++ 继承:面向对象编程的核心概念(二)

文章目录 5. 继承与友元6. 继承与静态成员7. 多继承及其菱形继承问题7.1 不同的继承方式7.2 虚继承 8. 继承和组合9. 总结 书接上回:C 继承:面向对象编程的核心概念(一) 5. 继承与友元 友元关系不能继承,也就是说基类友元不能访问…...

Chaos Mesh 混沌工程平台介绍、安装及使用指南

Chaos Mesh 混沌工程平台介绍、安装及使用指南 一、Chaos Mesh 简介 Chaos Mesh 是 PingCAP 开源的云原生混沌工程平台,支持在 Kubernetes 环境中模拟各种故障场景,帮助提升系统的容错性和可恢复性。 核心特性 丰富的故障类型: 资源类&…...

每天五分钟深度学习框架PyTorch:梯度裁剪解决RNN梯度爆炸的问题

本文重点 在循环神经网络训练的过程中,有时候很容易出现梯度爆炸的情况,如果出现这种问题,我们应该怎么办?本文先来分析一下为什么会出现这种情况,然后我们在给出解决方案 梯度爆炸的原因 我们从RNN训练的反向传播算法入手,当我们使用BPTT算法训练RNN的时候,它的公式…...

批量删除 PDF 中的所有图片、所有二维码图片以及指定的某张图片

PDF 文档中我们可以插入图片、文字等多种类型的资源。在某些场景下,可能我们需要删除 PDF 文档中的图片,有可能是需要删除所有的图片,也有可能是删除固定的某些图片。那碰到这种情况,我们应该怎么处理呢?今天就给大家介…...

力扣HOT100之普通数组:53. 最大子数组和

这道题目我用贪心做的,感觉用贪心的思路比较简单,以后要是面试碰到这道题就直接用贪心好了,这道题用贪心的核心思想就是不断将数组元素i加入总和sum,如果sum比当前维护的最大值result更大,说明当前遍历到的i是正数&…...

【Qt】C++前向声明与Qt信号与槽的区别

相同点:二者都可以解决头文件相互包含的问题 一、C 前向声明 概念:前向声明是在代码里仅仅声明一个类、函数或者变量,而不给出其完整定义。例如class MyClass; 就是对 MyClass 类的前向声明。 作用:主要是为了降低编译依赖&…...

SQL-木马植入、报错注入及其他

一、读写权限确认 show global variables like %secure%; 查看mysql全局变量的配置,当输入以上命令时,结果 secure_file_priv 空的时候,任意读写 secure_file_priv 某个路径的时候,只能在规定的那个路径下读写 secure_file_pri…...

基于 PHP 内置类及函数的免杀 WebShell

前言 PHP 作为广泛使用的服务端语言,其灵活的内置类(如 DOMDocument)和文件操作机制(.ini、.inc 的自动加载),为攻击者提供了天然的隐蔽通道。通过 动态函数拼接、反射调用、加密混淆 和 伪命名空间 等手法…...

主键id设计

主键自增id 🌱 1. 自增 ID(Auto Increment ID) ✅ 特点: • 数据库自带(MySQL, PostgreSQL 都支持) • 简单易用,可读性强 • 一般作为主键自带聚簇索引(主键就是物理存储顺序&…...

文件上传绕过的小点总结(6)

14.文件上传(文件包含漏洞)二次渲染 很多服务器为了防止代码嵌入图片,通常会将上传的图片进行重新生成处理,包括文件格式转换等等,嵌入的恶意代码很容易被改掉。于是产生了二次渲染,二次渲染的原理就是找到…...

传统应用容器化迁移实践

背景介绍:从传统部署到容器化迁移的必要性 在过去的运维工作中,某企业一直依赖于传统的物理机和虚拟机部署方式。然而,随着业务的快速发展和应用规模的不断扩大,传统部署方式的局限性逐渐显现: 资源利用率低&#xf…...

混境之地1

问题描述 小蓝有一天误入了一个混境之地。 好消息是:他误打误撞拿到了一张地图,并从中获取到以下信息: 混境之地的大小为 n⋅mn⋅m,其中 # 表示这个位置很危险,无法通行,. 表示道路,可以通行。他…...

LLM 加速技术有哪些

LLM 加速技术有哪些 目录 LLM 加速技术有哪些量化(Quantization)基本原理举例剪枝(Pruning)基本原理举例动态Shape(Dynamic Shape)基本原理举例算子融合(Operator Fusion)基本原理举例量化(Quantization) 基本原理 量化是指将模型中连续取值(如32位浮点数)的参数…...

CPP从入门到入土之类和对象Ⅲ

拷贝构造函数 拷贝构造函数是一个已经存在的对象去初始化一个新的对象时,调用的函数 例如: 假设我有一个盒子,里面装了一个苹果 拷贝构造函数的特点 拷贝构造函数是构造函数的一个重载拷贝构造函数的第一个参数必须是类类型对象的引用,例如…...

安全上网沙箱:多方面解决政企私的上网问题

在数字化的浪潮中,网络已成为我们工作与生活不可或缺的一部分。然而,网络的便捷也伴随着诸多安全隐患,尤其是对于企业、个人以及政企机构而言,安全上外网成为了至关重要的课题。 隔离保护:构建安全堡垒 沙箱技术在内网…...

空转 | GetAssayData doesn‘t work for multiple layers in v5 assay.

问题分析 当我分析多个样本的时候,而我的seurat又是v5时,通常就会出现这样的报错。 错误的原因有两个: 一个是参数名有slot变成layer 一个是GetAssayData 不是自动合并多个layers,而是选择保留。 那么如果我们想合并多个样本&…...

26、web前端开发之CSS3(三)

5. 文本(Text) CSS3大大增强了对文本样式和排版的控制,使得网页设计更加灵活和多样化。本讲详细介绍CSS3中常用的文本相关属性,包括文本对齐、字体大小、行高、字母间距、单词拆分、溢出隐藏等,帮助开发者更好地控制和…...

第 8 章:使用更好的库_《C++性能优化指南》_notes

使用更好的库 第八章核心知识点解析编译与测试建议总结优化原则重点内容:第一部分:多选题(10题)第二部分:设计题答案与解析多选题答案:设计题答案示例(部分): 测试用例设…...

【面试八股】:常见的锁策略

常见的锁策略 synchronized (标准库的锁不够你用了)锁策略和 Java 不强相关,其他语言涉及到锁,也有这样的锁策略。 1. 悲观锁,乐观锁(描述的加锁时遇到的场景) 悲观锁:预测接下来…...

Apache Iceberg 解析,一文了解Iceberg定义、应用及未来发展

什么是 Iceberg? Apache Iceberg 是一种开源的 表格式(Table Format) ,专为超大规模数据分析场景设计,通过标准化数据存储规范与访问协议,解决了传统数据湖在元数据管理、事务控制、查询性能等方面的核心痛…...

Ubuntu 优化启动时间优化

优化 Ubuntu 20.04 的启动时间可以从多个方面入手,以下是详细的步骤和建议: 一、分析启动耗时 首先检查系统启动各阶段的耗时: systemd-analyze time # 查看整体启动时间 systemd-analyze blame # 列出各服务/进程的启动耗时 …...

【Git 常用指令速查表】

Git 常用指令速查表 Git 常用指令速查表目录1. 初始化仓库2. 提交代码流程3. 分支管理4. 远程仓库操作5. 撤销操作6. 查看状态与日志7. 其他实用指令完整操作示例常用场景速查表 Git 常用指令速查表 目录 初始化仓库提交代码流程分支管理远程仓库操作撤销操作查看状态与日志其…...

Linux实用操作及命令

一、各类小技巧(快捷键) 1、强制停止(ctrlc) Linux某些程序的运行,如果想要强制停止它,可以使用快捷键ctrl c 命令输入错误,也可以通过快捷键ctrl c,退出当前输入,重…...

洛谷 P10516 数据结构 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​) 和 b ( b 1 , b 2 , ⋯ , b n ) b(b_1,b_2,\cdots,b_n) b(b1​,b2​,⋯,bn​),有 m m m 个操作分三种: add ⁡ ( l , r , k , t ) \operatorname{ad…...

在IDEA中使用TortoiseSVN

一、前言 原版SVN由于下载路径中没有svn.exe文件,导致IDEA中无法使用命令行提交项目代码,因此,现在卸载旧版本TortoiseSVN,下载附有svn.exe的新版TortoiseSVN,下载使用过程记录如下 二、下载过程 卸载就在 控制面板…...

基于 ffmpeg 实现合并视频

ffmpeg是一个强大的多媒体处理工具,支持视频文件的合并。 列出目录下所有MP4文件 import os import glob# 当前目录 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目录下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…...

如何在 HTML 中嵌入外部字体,有哪些注意事项?

大白话如何在 HTML 中嵌入外部字体,有哪些注意事项? 在 HTML 里嵌入外部字体,能让网页文字更有个性,瞬间提升页面的吸引力。下面就来详细说说怎么嵌入外部字体,以及其中的注意事项。 嵌入外部字体的方法 1. 使用 fo…...

三极管原理及应用

一、结构 基极(Base,符号:B) 基极是三极管的控制端,用于输入控制信号。通过基极电流的大小,可以控制集电极与发射极之间的电流导通程度,实现电流放大或开关功能。 发射极(Emitter&…...

三个串口同时打开并指定数据包控制指令思想

可以对嵌入式串口数据包指令设置做一次总结: 首先确定你的数据包大小,传统的接收串口数据到数组存储会出现需要循环遍历数组去读取数据的弊端,所以我设计了一个机制,只有当你想要读取外界指令时,才开始读取外界发过来…...

“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)

&#x1f6a8;&#x1f4e2; "征服HTML引号恶魔&#xff1a;“完全解析手册” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;当引号变成"恶魔" &#x1f631; 是否遇到过这种情况&#xff1a; 写HTML时满心欢喜输入<div title"他…...

MQL5教程 04 脚本开发实战、指标开发基础

文章目录 一、脚本开发实战1、给脚本设置快捷键2、运行时显示输入参数界面3、开市价单4、一键平仓5、修改止盈止损6、一键删除当前图表所有挂单 二、指标开发基础 一、脚本开发实战 1、给脚本设置快捷键 在MT5导航栏中&#xff0c;选定脚本&#xff0c;鼠标右击 → 设置热键 …...

【Qt】Ubuntu22.04使用命令安装Qt5和Qt6

1、安装Qt5 注意:Ubuntu22.04已经没有 qt5-default ,因此不能一键安装啦 1)安装核心组件 sudo apt install qtbase5-dev qtchooser qt5-qmake qtcreator2)安装QtCreator sudo apt install qtcreator3)安装工具包、Qt Quick 开发的核心库(qtdeclarative5-dev) sudo a…...

海康设备http监听接收报警事件数据

http监听接收报警事件数据 海康获取设备报警事件数据两种方式&#xff1a; 1、sdk 布防监听报警事件数据&#xff08;前面文章有示例&#xff09; 2、http监听接收报警事件数据 http监听接收报警事件数据&#xff0c;服务端可以使用netty通过端口来监听获取事件数据。 WEB 端…...

【MVCC快照如何实现】

MVCC(多版本并发控制)快照的实现原理 MVCC(Multi-Version Concurrency Control)是现代数据库实现事务隔离级别的核心技术&#xff0c;它通过数据多版本和快照机制来实现高效的并发控制。下面我将详细解析MVCC快照的实现机制。 一、MVCC核心组件 1. 版本链结构 MVCC通过以下…...

STM32中不同FLASH的芯片启动文件选择规则

F103ZET6的FLASH大小是512K&#xff0c;所以选择startup_stm32f10x_hd.s F103C8T6的FLASH大小是64K&#xff0c;所以选择startup_stm32f10x_md.s 移植需要注意的事项&#xff1a; 从ZET6到C8T6&#xff0c;需要更改 1&#xff09;启动文件 2&#xff09;C/C选项卡...

树莓集团商业模式解析:树莓集团是国企吗?

树莓集团作为中国市场的重要企业实体&#xff0c;其所有制性质一直受到业界关注。从公开资料显示&#xff0c;树莓集团并非传统意义上的国有企业&#xff0c;而是一家具有混合所有制特征的现代化企业集团。其股权结构中既包含国有资本成分&#xff0c;也吸纳了社会资本和民营投…...

mock.js模拟数据

MOCK模拟后端数据 1.按照mock.js npm install mockjs2.在src目录下建立mock目录&#xff0c;在该目录下建立index.js文件&#xff0c;该文件中写上你所需要的数据&#xff0c;示例如下&#xff1a; import Mock from mockjs let data Mock.mock("/data/person",&…...

如何自动规整化(格式化)HTML

如果你想要自动规整化&#xff08;格式化&#xff09;HTML&#xff0c;可以使用以下方法&#xff1a; 方法 1&#xff1a;使用 VS Code 进行 HTML 格式化&#xff08;推荐&#xff09; 步骤 安装 Visual Studio Code打开你的 HTML 文件按下 Shift Alt F&#xff08;Windows…...

MySQL数据库入门

目录 前言 一、安装软件 二、普通指令使用 三、MySQL接口API相关函数 1、API函数使用步骤 2、mysql_init-MYSQL对象初始化 3、mysql_real_connect()——数据库引擎建立连接 4、mysql_close()——关闭数据库连接 5、mysql_query()——查询数据库某表内容 6、mysql_stor…...

SpringBoot集成Couchbase开发与实践

1 前言 1.1 什么是Couchbase Couchbase 是一个高性能的 NoSQL 数据库,支持文档存储、内存缓存和分布式计算。它结合了内存数据库的速度和灵活性与传统数据库的持久性和查询能力。 1.2 Couchbase的特点与优势 高性能:利用内存缓存加速数据访问。可扩展性:支持水平扩展,能…...

一周掌握Flutter开发--8. 调试与性能优化(上)

文章目录 8. 调试与性能优化核心技能8.1 使用 Flutter DevTools 分析性能8.2 检查 Widget 重绘&#xff08;debugPaintSizeEnabled&#xff09;8.3 解决 ListView 卡顿&#xff08;ListView.builder itemExtent&#xff09; 其他性能优化技巧8.4 减少 build 方法的调用8.5 使用…...

动态路由机制MoE专家库架构在多医疗AI专家协同会诊中的应用探析

随着医疗人工智能技术的飞速进步,AI在医学领域的应用日益增多,尤其是在复杂疾病的诊断和治疗中,AI技术的应用带来了巨大的潜力。特别是动态路由机制混合专家(Mixture of Experts,MoE)架构,因其灵活、高效的特点,正逐渐成为实现多AI专家协同会诊的关键技术。通过将多个不…...

Linux上位机开发实践(开源框架和开源算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 做嵌入式软件开发&#xff0c;如果软件本身比较简单&#xff0c;只是图形界面显示&#xff0c;那么相关的开发工作并不难。最主要的内容也就是数据…...