实例化(Instancing)与合批(Batching)

优化:批处理 SRP Batcher >Static Batching > GPU Instancing > Dynamic Batching Unity渲染优化技术优先级及原理分析 摘要:Unity渲染优化主要包含四种合批技术,优先级依次为SRPBatcher>StaticBatching>GPUInstancing>DynamicBatching。SRPBatcher通过降低SetPassCall提升性能,适合URP/HDRP项目;StaticBatching以内存换CPU时间,适用于静态场景;GPUInstancing通过单次DrawCall渲染相同网格物体;DynamicBatching则动态合并小物体顶点数据。各技术原理 阅读详情
维度实例化 (Instancing)合批 (Batching)
几何体要求    必须相同    可以不同
材质要求    必须相同    必须相同
单个元素变换    容易(修改矩阵)    困难(修改顶点 buffer)
单个元素增删   较容易(设置 count)    困难(需重建)
Draw Call    1 次   1 次
内存占用    低(几何体只存一份)    高(所有顶点都存)
适合场景    大量相同形状    大量不同形状的静态物体
点击检测    
 
需要 GPU picking 或 instanceId    通过 intersect.index 反查

3D 渲染中,CPU 每次告诉 GPU "画一个物体"就是一次 Draw Call。每次 Draw Call 都有固定开销:

  • 切换材质/shader
  • 绑定顶点缓冲区
  • 设置 uniform 变量
  • 发起绘制命令

如果场景中有 10000 个车位,每个车位一个 Mesh,就是 10000 次 Draw Call。GPU 本身很快,但 CPU 和 GPU 之间的通信成本会把帧率拖垮。

两种技术的核心目标都是:减少 Draw Call 数量。


实例化(Instancing / InstancedMesh)


原理


GPU 一次绘制命令画出同一个几何体的多个"副本",每个副本可以有不同的位置、旋转、缩放、颜色。

// Three.js 中的用法
const geometry = new THREE.BoxGeometry(2.5, 5, 0.1); // 一个车位的形状
const material = new THREE.MeshBasicMaterial();
const mesh = new THREE.InstancedMesh(geometry, material, 10000); // 10000 个实例

// 每个实例设置不同的变换矩阵
const matrix = new THREE.Matrix4();
for (let i = 0; i < 10000; i++) {
    matrix.setPosition(positions[i].x, positions[i].y, positions[i].z);
    mesh.setMatrixAt(i, matrix);
}


特点

  • 1 次 Draw Call 画出所有实例
  • 所有实例共享同一个 Geometry 和 Material
  • 每个实例可以有独立的变换矩阵(位置/旋转/缩放)和颜色
  • GPU 通过 gl_InstanceID 区分不同实例

适用场景

  • 大量形状相同的物体:树木、草、粒子、车位标线、柱子
  • 形状一样但位置/颜色不同

限制

  • 所有实例必须是同一个几何体(不能一个是方形车位一个是三角形)
  • 所有实例必须用同一个材质
  • 单个实例的拾取(点击检测)需要额外处理

合批(Batching / Geometry Merging)

原理


把多个不同的几何体的顶点数据合并到一个大的 BufferGeometry 中,用一次 Draw Call 画出来。

// 项目中的实际做法(floor-layer-three-view.vue)
const positions: number[] = [];  // 所有点的坐标放在一个数组里
const colors: number[] = [];

points.forEach(point => {
    positions.push(point.x, point.y, point.z);
    colors.push(r, g, b);
});

const geometry = new THREE.BufferGeometry();
geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));

const batchedPoints = new THREE.Points(geometry, material);
batchedPoints.userData = {
    isBatched: true,
    pointDataArray: metadataArray,  // 保留每个点的元数据,用于点击查找
};


特点

  • 1 次 Draw Call 画出所有合并后的几何体
  • 不同形状的几何体可以合并(只要材质相同)
  • 合并后是一个整体,单个元素的变换需要修改顶点数据
  • 需要自己维护"哪个顶点属于哪个原始物体"的映射关系

适用场景

  • 大量静态的不同形状物体:拓扑线段、轨迹点、点云
  • 不需要频繁单独移动/删除某个元素
  • 本项目中的典型用法:把同一楼层的所有 topo link 线段合并成一个 THREE.LineSegments

限制

  • 合并后单个元素的变换很麻烦(需要修改 buffer 中的顶点)
  • 动态增删元素需要重建整个 buffer
  • 点击检测需要通过 intersect.index 反查元数据

对比


维度    实例化 (Instancing)    合批 (Batching)
几何体要求    必须相同    可以不同
材质要求    必须相同    必须相同
单个元素变换    容易(修改矩阵)    困难(修改顶点 buffer)
单个元素增删    较容易(设置 count)    困难(需重建)
Draw Call    1 次    1 次
内存占用    低(几何体只存一份)    高(所有顶点都存)
适合场景    大量相同形状    大量不同形状的静态物体
点击检测    需要 GPU picking 或 instanceId    通过 intersect.index 反查

Unity Shader 学习17:合批渲染 合批主要是针对这三个概念进行优化减少: ① SetPass Call:一次渲染状态切换,也就是每次切换 材质/Pass 时,就会触发一次SetPass Call ② Draw Call:cpu 调用一次 gpu 绘制函数 ③ Batch:表示一组可以一起交给gpu的Draw Call 优化结果可以在 Game窗口-Stats 或 FrameDebugger 中查看。 阅读详情

相关推荐

Unity动态合批实战:如何用Dynamic Batching优化你的移动端游戏性能

本文深入探讨了Unity动态合批(Dynamic Batching)在移动端游戏性能优化中的实战应用。文章详细解析了动态合批的工作原理、适用场景与关键限制(如顶点数、材质实例),并提供了在移动端启用、配置及调试的具体策略。同时,对比了URP/HDRP管线下的SRP Batcher方案,帮助开发者根据项目需求做出精准选择,有效降低Draw Calls,提升游戏流畅度。

gitlab7runner的博客 577

Unity中基于Gpu Instance进行大量物体渲染的实现与分析(一)

图 一个使用gpu instance绘制4000棵树的场景 在3D渲染中,尤其是现代3D游戏中,我希望能够绘制越来越多的场景物体,这对于设备(尤其是移动端)的性能是个极大的考验,对于新一代的渲染api,都逐渐支持了Gpu Instancing技术,这对于大量相同物体的绘制提供了一个新的方案,在最新的unity5中也提供了对gpu instance 的支持,我尝试在unity5中利用gpu instance 技...

真像大白阿的博客 5603

Unity URP渲染优化实战:SRP Batcher、GPU Instancing、动态与静态合批全解析

在实时渲染领域,Draw Call优化是提升应用性能的核心课题之一。其原理在于减少CPU向GPU提交绘制指令的次数与开销,从而降低CPU瓶颈,释放GPU的并行计算潜力。从技术价值看,高效的合批与批处理机制能显著提升帧率,尤其在移动端与大型场景中至关重要。常见的应用场景包括游戏中的植被渲染、场景道具、角色绘制以及UI系统。本文聚焦Unity URP管线,深入剖析SRP Batcher、GPU Instancing、动态合批与静态合批这四大核心优化技术,通过实战场景演示如何根据物体静态性、重复性及材质属性(如是

weixin_33841722的博客 453

Unity动态批处理断批元凶全解

根本原因是——动态批处理要求物体的"渲染状态几乎完全一致",任何差异都会断批。主要元凶清单:① 不同材质(最常见);② 材质实例化(用.material或运行时改属性,超隐蔽);③ 顶点数超限(高模);④ 多 Pass Shader;⑤ 不同纹理/Shader 关键字;⑥ 负缩放/非统一缩放;⑦ 受不同光照影响、不同光照贴图(隐蔽大户);⑧ 实时阴影;⑨ 与 Instancing 冲突;⑩ 不同渲染队列/层。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 128

Unity动态合批避坑指南:为什么你的Dynamic Batching总是不生效?

本文深入解析Unity动态合批(Dynamic Batching)的底层机制与常见失效原因,提供从原理到调优的完整解决方案。通过真实案例和性能优化决策树,帮助开发者有效降低Draw Calls,避免CPU负担增加,提升项目运行效率。特别针对URP/HDRP等现代渲染管线的合批策略进行了详细对比分析。

weixin_30790841的博客 348

Unity URP性能优化:SRP Batcher、GPU Instancing与静态合批的深度解析与实战选择

在实时渲染与游戏开发中,渲染管线优化是提升应用性能的核心环节,其核心原理在于减少CPU与GPU之间的通信开销与指令提交次数。通过批处理(Batching)技术,可以将多个渲染对象合并处理,从而显著降低Draw Call(绘制调用)数量,这是优化渲染效率的关键技术价值。具体到Unity的通用渲染管线(URP),开发者主要面临SRP Batcher、GPU Instancing和静态合批(Static Batching)这三种核心优化手段的选择。它们分别针对CPU数据提交、GPU并行克隆与离线网格合并等不同场景

weixin_34216196的博客 487

Unity中的静态合批、动态合批、GPU Instance 以及SRP Batching

Unity中的静态合批、动态合批、GPU Instance 以及SRP Batching

qq_41841073的博客 1万+

Unity动态合批(Dynamic Batching)实战优化指南

本文深入解析Unity动态合批(Dynamic Batching)的核心原理与实战优化技巧。详细阐述了其通过合并Draw Call提升渲染性能的工作机制,并系统梳理了材质实例、顶点数限制、缩放变换等关键生效条件与常见失效原因。文章提供了从全局开关到相机、对象级控制的配置指南,探讨了性能权衡,并介绍了MaterialPropertyBlock、GPU Instancing等高级替代方案,帮助开发者有效优化游戏性能。

weixin_29022115的博客 354

动态合批(Dynamic Batching):每帧现做的“临时打包“

动态合批 = Unity每一帧自动把"会动的小物体"临时合并,减少DrawCall关键词:- 会动的物体 ✓(静态合批做不到的)- 每一帧都重新合并- 自动进行(基本不用你操作)动态合批要求:✓ 顶点属性 < 900(核心限制!✓ 相同材质✓ 单Pass Shader✓ 不用多光源逐像素光照✓ 没有Lightmap差异专治"会动的小物体"——静态合批做不到的领域。因为物体会动、位置每帧变,所以Unity每一帧都重新合并它们,减少DrawCall。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 4222

Unity动态合批深度解析:原理、限制与实战优化策略

在实时图形渲染中,Draw Call是影响性能的关键指标之一,它代表了CPU向GPU发起的一次绘制指令。为了降低Draw Call数量,提升渲染效率,批处理(Batching)技术应运而生。其核心原理是将多个使用相同状态(如材质)的物体合并,通过单次数据提交完成渲染,从而减少CPU与GPU之间的通信开销。这项技术对于移动端和WebGL等性能敏感平台尤为重要,能有效提升帧率。动态合批(Dynamic Batching)是Unity引擎内置的一种批处理技术,它针对每帧都在运动的物体,在CPU端实时合并其顶点数据

524

Unity GPU Instancing失效根因:Dynamic Batching语义抢占解析

GPU Instancing是Unity批量渲染同材质物体的核心优化技术,其原理依赖顶点着色器对SV_InstanceID及自定义实例数据的稳定读取;当Dynamic Batching同时启用时,二者会竞争TEXCOORD等顶点语义槽位,导致实例ID错乱、Draw Call降级甚至帧间闪烁;这种冲突并非Shader错误,而是Unity底层渲染管线中两种合批机制在顶点流层面的资源争夺;典型表现包括Instancing开关无效、Instance Count归零、周期性绘制异常;本文聚焦于Built-in Ren

weixin_33738578的博客 640

静态合批(Static Batching):Unity 的“免费午餐“优化

静态合批 = Unity自动把"不会动"的物体合并成大网格,减少DrawCall你只需要:勾选"Static"Unity自动:帮你合并勾选"Static"= 向Unity承诺"我永远不动",Unity自动把相同材质的静态物体,烘焙合并成大网格,减少DrawCall。优点:几乎零成本(勾个框),效果显著;代价:占用额外内存,失去独立剔除。适合"摆好就不动"的场景物体,会动的千万别勾,大量相同的用Instancing!核心口诀:勾框承诺不动,同材质自动合,换内存减调用,动的别勾会穿帮!

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 3134

Unity性能优化:深入理解DrawCall与合批技术实战指南

在实时图形渲染中,CPU与GPU的协同效率是决定应用流畅度的关键。其核心原理在于CPU通过DrawCall向GPU提交绘制指令,每一次状态切换都会产生新的调用,从而带来性能开销。这项技术的核心价值在于通过减少指令提交次数,显著降低CPU负担,提升帧率与响应速度,尤其在移动端等CPU受限平台至关重要。常见的应用场景包括游戏场景渲染、UI界面绘制以及大量重复物体的实例化渲染。本文聚焦Unity引擎中的DrawCall优化,深入剖析静态合批与动态合批两大核心机制,并结合GPU Instancing等现代图形技术,

weixin_30265103的博客 432

Unity 性能优化 之 理论基础 (Culling剔除 | Simplization简化 | Batching合批)

场景Shader需要支持SRP Batcher,可以在Shader信息界面中观察“SRP Batcher”项是否为“Compatible”。URP/HDRP中的Lit/Unlit Shader默认支持。当场景中有很多物体与材质球,但是这些材质球使用的是同一个shader时,SRP Batcher的CBUFFER维护逻辑将带来更优的性能开销。细分起来,Culling为去除不需要渲染的信息,Simplization为对待渲染的内容根据类型分类,Batching为对数据路径类似的信息进行打包转发。

陈言必行 -- Unity游戏开发领域优质博主 1745

Unity动态合批导致顶点偏移与绘制闪烁的根源解析

Dynamic Batching是Unity为减少Draw Call而设计的CPU端合批机制,其核心原理是将多个物体的世界坐标反向转换为统一局部空间并拼入共享顶点缓冲区。这一过程虽提升渲染效率,但因浮点精度损失、worldToLocalMatrix病态(如非统一缩放)、以及与GPU Instancing的底层逻辑互斥,极易引发顶点坐标微小偏移(0.001级),在深度测试敏感区域诱发Z-Fighting式闪烁。该问题跨平台复现,影响前向/延迟/URP全管线,且常被误判为Shader或美术资源问题。本文聚焦于定

weixin_33717117的博客 605

Cadence OrCAD常见引脚错误排查指南:从原理图到封装的完整解决方案

本文详细解析Cadence OrCAD设计中常见的引脚错误问题,提供从原理图到封装的系统化解决方案。涵盖错误诊断、元件库修复、封装管理及自动化处理技巧,帮助工程师高效解决ORCAP-36022等典型错误,确保设计流程顺畅。

weixin_29294975的博客 258

Unity GPU 合批优化详解

场景优先方案固定建筑、道路、墙大量同款树、草、石头URP 下大量不同物体很小的低模动态物体聊天、背包、HUDCanvas 拆分 + 图集 + 对象池玩家、敌人、NPC对象池 + LOD + 动画/AI 降频一句话:合批不是目的,稳定帧率才是目的。发现卡↓Profiler 判断 CPU 还是 GPU↓Frame Debugger 看渲染提交↓只改一个优化点↓重新测试↓记录数据这样做,你就不会靠感觉优化,也不会把项目越改越乱。

China_sunny的博客 410

【嵌入式底层知识修炼】按键和LED共用IO口的分时复用扫描方法

文章目录01 - PCB原理图例程02 - 分时复用的注意项和设计2.1 - 注意项2.2 - 设计03 - 代码实现 只要我跑的速度够快,寂寞就追不上我 只要Key和Led切换速度够快,人眼就看不出来 ————小白   如果你存在按键Key和显示Led共用同一个IO时,需要分时复用的需求,则可以移植代码进行使用: 代码所占code少于0.5K 线程安全,中断安全 可移植性高,配置容易 注意:系统需要存在一个至少为1ms的时钟中断 01 - PCB原理图例程   举2个Key和Led共用IO口的

单眼皮根号三的博客 1万+

极致性能HUD优化实战教程:从 UGUI 到 GPU Instancing + 动态合批

本文介绍了如何将游戏中的HUD(如血条和伤害飘字)从UGUI方案优化为高性能的GPU渲染方案,包括使用GPU Instancing和动态合批Mesh技术。旧方案存在CPU开销高、Draw Call爆炸和GC压力大等问题,而新方案通过ComputeBuffer传递数据、合批渲染等方式显著提升了性能。文章详细讲解了核心概念、新旧方案对比及具体实现步骤,最终将血条Draw Call降至1~N/1023,飘字Draw Call降至1。

学无止境的专栏 483

华为OD机试 - 猴子吃桃 - 二分查找(Java 新系统 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 3851

五步通关!宝塔Linux部署ASP.NET Core的魔法秘籍大公开!

摘要: 本文提供ASP.NET Core应用五步部署攻略,涵盖从环境配置到线上运行的完整流程: 1️⃣ 环境准备:安装宝塔面板、ASP.NET Core运行时及开放端口; 2️⃣ 应用发布:通过dotnet publish生成独立部署包并上传服务器; 3️⃣ Nginx配置:设置反向代理将域名请求转发至应用端口; 4️⃣ 进程守护:使用Supervisor确保应用持续运行; 5️⃣ HTTPS加密:通过宝塔快速申请SSL证书并解决验证路径冲突。 关键点: 强调权限设置(755)、端口开放及反向代理细节; 提

java专栏 970

Unity动态合批性能优化:原理、限制与实战避坑指南

在实时渲染中,Draw Call优化是提升应用性能的关键技术之一。其核心原理在于减少CPU与GPU之间的通信开销,通过合并渲染指令来降低提交次数。动态合批(Dynamic Batching)作为一项自动优化技术,能在运行时将多个符合条件的小网格合并,从而显著减少Draw Call数量,尤其适用于移动端或低端设备。这项技术的价值在于它能有效提升渲染效率,但前提是开发者必须深刻理解其严格的限制条件,如顶点属性规模、材质一致性、变换统一性等。在实际应用场景中,例如大量草丛、碎石或粒子效果的渲染,动态合批能发挥巨大

weixin_33805743的博客 359

把开源 Skills 集成到 LangGraph 项目

1. 定义智能体状态(必须包含 messages,其他字段按需扩展)messages: List[HumanMessage | AIMessage | ToolMessage] # 消息流(核心)skill_output: Optional[str] # 存储 Skill 执行结果next_node: str # 控制流程跳转# 2. 定义智能体决策节点(决定是否调用 Skill)"""智能体决策逻辑:根据用户输入判断是否调用开源 Skill"""# 获取最后一条用户消息。

lpfasd123的博客 904
上一篇: call、apply和bind的原理及使用场景
下一篇: 推荐一篇学习redis的文章
nocol.
博客等级 码龄7年 587粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值