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

Unity合批优化:静态与动态合批全解析

在游戏开发(尤其是使用 Unity 引擎)中,合批(Batching)是减少 Draw Call(渲染调用)、提升游戏帧率最核心的优化手段。它的核心原理是将多个物体的网格(Mesh)合并在一起,用一次渲染指令发给 GPU。

静态合批和动态合批各有其严格的触发要求,下面为您详细梳理:

一、 静态合批(Static Batching)的要求

静态合批适用于在游戏运行过程中绝对不会移动、旋转或缩放的物体(如建筑、道路、大树等)。

核心要求:

  1. 必须勾选 Static:物体的 Inspector 面板右上角,必须勾选Batching Static(或者直接勾选全套Static)。

  2. 材质球必须相同:所有要合批的物体必须使用同一个材质球(如果是不同物体,通常需要将它们的纹理打包到一张图集 Atlas 中,并共享同一个材质)。

  3. 网格(Mesh)可以不同:这是静态合批的优势,即便正方体、长方体、石头样式各异,只要材质相同就能合批。

  4. 不能有动态位移:运行时物体不能发生任何 Transform(位置、角度、缩放)的改变。

⚠️代价与限制:

静态合批是以空间换时间。Unity 会在打包或加载时,将这些静态物体的网格合并成一个巨大的新网格。如果一个相同的场景道具(比如一棵树)被复制了 100 次并做静态合批,内存中就会执行 100 次网格拷贝,导致内存占用暴增

二、 动态合批(Dynamic Batching)的要求

动态合批适用于正在移动的、小型的轻量级物体(如粒子、飞镖、零散的小道具)。由于它是在 CPU 运行时每帧实时计算合并的,所以为了不让 CPU 崩溃,限制极其苛刻

核心要求:

  1. 材质球必须相同:与静态合批一样,必须使用同一个材质(Renderer.sharedMaterial)。

  2. 顶点属性限制(最核心限制)

    • 动合批的网格物体,其顶点属性(Vertex Attributes)数量不能超过 900 个

    • 如果 Shader 使用了顶点坐标、法线、UV 坐标,那么该网格的顶点数不能超过 300 个。如果还用了切线(Tangent),顶点数限制会更低。

  3. 缩放(Scale)限制

    • 物体不能有非等比缩放(比如 X 放大 2 倍,Y 放大 1 倍)。

    • 镜像缩放(如缩放值为负数-1)也会导致合批失败。

  4. 光照贴图(Lightmap)一致:物体必须指向光照贴图中的同一个位置,或者都没有光照贴图。

  5. Shader 限制:不能使用多 Pass(Multi-pass)的 Shader,否则会打破合批。

三、 快速对比表

特性静态合批 (Static Batching)动态合批 (Dynamic Batching)
适用对象静止不动的物体(场景建筑等)移动的小物体(粒子、道具等)
物体网格大小没有限制(大网格也可以)极小(通常顶点数 < 300)
材质要求必须相同必须相同
性能损耗点增加内存消耗、包体变大增加每帧的 CPU 计算开销
运行时能否移动绝对不能可以移动

💡 现代引擎的趋势

如果你使用的是 Unity 的新渲染管线(URP 或 HDRP),你可能会发现动态合批在很多情况下默认是被关闭的。因为现代优化更倾向于使用SRP Batcher(SRP 合批)GPU Instancing(GPU 实例化)

  • SRP Batcher:它不限制顶点数,甚至不要求物体网格相同,它不合并网格,而是通过在显存中缓存材质的 CBuffer(常量缓冲区)来极大地减少渲染上下文切换的开销。

  • GPU Instancing:适合数量巨大且网格完全相同的动态物体(例如满地的草、大批量的士兵),不仅不耗 CPU,还能完美合批。

http://www.jsqmd.com/news/1106232/

相关文章:

  • 报文发送非网络基本功能
  • 冻库低温环境下的机器人搬运技术测评
  • Claude Code 接入第三方模型指南
  • ASP.NET Core 之 Identity 入门(一)
  • React Hooks开发实践
  • 集成,持续交付,持续部署,敏捷开发,DevOps的关系
  • 2026年AI论文软件盘点:12款神器助你高效完成初稿生成、排版和降AI率
  • Android开发转AI Agent:第12天——Function Calling,让LLM从“说话“变成“做事“
  • Spring MVC开发实践教程
  • Python装饰器开发实践
  • step1. 调用摄像头
  • 给阿嬤一封来自云端的信(上)
  • NestJS框架教程
  • STM32与MAX9744实现高效音频放大系统设计
  • 量子计算中的基态制备与经典储层方法解析
  • 终极Win11系统优化指南:免费工具让你的Windows 11运行如飞
  • 游戏编程十年总结(下)
  • AI应用GEO排名优化指南:提升搜索可见性
  • 如何提取 Word 文档中的表格并导出为 Excel(Python 教程)
  • 第5章 Function Call 与工具调用框架《AI Agent 开发平台资深技术专家 AI Agent 应用架构师 CTO 面试题库详解》
  • 微架构安全:MDAV问题与防御机制集成挑战
  • JSON数据格式解析与应用
  • 【安全】Sql注入漏洞的危害和防御
  • Medisca在创始人Antonio Dos Santos的引领下开启发展新篇章
  • GPU监控与进程管理:科研必备的nvidia-smi详解
  • 6DoF运动跟踪技术:从IMU到姿态解算的实践指南
  • 【C++并发系列】第十二章:CPU cache line 和 false sharing
  • 打包带在高温环境下会变形吗?
  • Python代码重构最佳实践
  • Zephyr RTOS入门:设备树(DTS)与Kconfig配置体系——设备树、配置系统