上回简单总结了一下静态合批,这次我们继续说说动态合批

| 动态合批

试想一个场景:一场激烈的战斗中,双方射出的箭矢飞行在空中,数量很多材质也相同;但因为都在运动状态,所以无法进行静态合批;倘若一个一个的绘制这些箭矢,则会产生非常多次绘制命令的调用。

让人热血沸腾的一场激战

对于这些模型简单材质相同、但处在运动状态下的物体,有没有适合的批处理策略呢?有吧,动态合批就是为了解决这样的问题。

动态合批没有像静态合批打包时的预处理阶段,它只会在程序运行时发生。动态合批会在每次绘制前,先将可以合批的对象整理在一起(Unity中由引擎自动完成),然后将这些单位的网格信息进行“合并”,接着仅向GPU发送一次绘制命令,就可以完成它们整体的绘制。

动态合批比较简单,但有两点仍然需要注意:

1、合批并非是在绘制前“合并网格“

动态合批不会在绘制前创建新的网格,它只是将可以参与合批单位的顶点属性,连续填充到一块顶点和索引缓冲区中,让GPU认为它们是一个整体。

在Unity中,引擎已自动为每种可以动态合批的渲染器分配了其类型公用的顶点和索引缓冲区,所以动态合批不会频繁的创建顶点和索引缓冲区。

MeshRenderer、SpriteRenderer动态合批时使用了公用的顶点、索引缓冲区

ParticleSystemRenderer动态合批时使用了与MeshRenderer不同的公用顶点、索引缓冲区

2、合批前会先处理每个顶点的顶点属性

在向顶点和索引缓冲区内填充数据前,二手手游账号转让引擎会处理被合批网格的每个顶点信息,将其空间变换到世界坐标系下。

这是因为这些对象可能都不属于相同的父节点,因此无法对其进行统一的空间转换(本地到世界),需要在送进渲染管线前将每个顶点的坐标转换为世界坐标系下的坐标(所以Unity中,合并后对象的顶点着色器内被传入的M矩阵,都是单位矩阵)。

Unity动态合批的条件

相对于上述看起来有点厉害但是本质上无用的知识而言,了解动态合批规则其实更为重要。比如:

  • 材质球相同;
  • Mesh顶点数量不能超过300以及顶点属性不能超过900;
  • 缩放不能为负值(x、y、z向量的乘积不能为负)等。

但我个人认为你不需要记住每一个条件,除了上述相对重要些的条件外,其余的可以通过FrameDebugger中提示的合批失败原因,来反向了解合批条件。

与静态合批的差别

动态合批与静态合批最大的差别在于:

1、动态合批不会创建常驻内存的“合并后网格”,也就是说它不会在运行时造成内存的显著增长,也不会影响打包时的包体大小;

2、动态合批在绘制前会先将顶点转换到世界坐标系下,然后再填充进顶点、索引缓冲区;静态合批后子网格不接受任何变换操作,仅手动合批后的Root节点可被操作,因此静态合批的顶点、索引缓冲区中的信息不会被修改(Root的变换信息则会通过Constant Buffer传入);

3、因为2的原因,动态合批的主要开销在于遍历顶点进行空间变换时的对CPU性能的开销;静态合批没有这个操作,所以也没有这个开销;

4、动态合批使用根据渲染器类型分配的公共缓冲区,而静态合批使用自己专用的缓冲区。

虽然在Unity中,存在多种可以被动态合批的渲染器类型,而且其合批规则可能也略有不同;但我个人认为其原理应该是相似的,因此这里就不针对每种渲染器做单独的测试和说明了,后面有必要、有机会、有缘分的话,再仔细了解吧,嘿嘿。

| 写在最后

不出意外的话,下次更新的内容应该是实例化渲染

由浅到浅入门批量渲染(二)相关推荐

  1. 由浅到浅入门批量渲染(一)

    好久不见. 这是第32篇与游戏开发有关的文章. | 写在最前 嘿嘿, 确实是好久没有更新了... 最近在准备公司的技术分享,主题是入门批量渲染,想着反正也总结了,不如充几篇博客吧,也算显得没有那么半途 ...

  2. 由浅到浅入门批量渲染(三)

    上回简单总结了一下动态合批,这次我们继续说说实例化渲染. | 实例化渲染 当我们想要呈现这样的场景:一片茂密的森林.广阔的草原或崎岖的山路时,会发现在这些场景中存在大量重复性元素:树木.草和岩石. 仙 ...

  3. 批量 材质 调整_游戏图形批量渲染及优化:Unity静态合批技术

    作者:枸杞忧天 (本文首发于公众号"偶尔学学Unity",文章仅为作者观点,不代表GWB立场) 最近在准备公司的技术分享,主题是入门批量渲染,想着反正也总结了,不如充几篇博客吧,也 ...

  4. 【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇:DirectX初始化四步曲

    这篇文章里,我们将迈出精通DirectX的第一步,先了解典型Direct3D程序的书写流程,然后学习COM接口的对象的一些思想,然后按照"四步曲"的思路,系统地学习DirectX的 ...

  5. 【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇:DirectX初始化四步曲...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8197792 作者:毛星云(浅墨) ...

  6. 【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇 DirectX初始化四步曲

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:  http://blog.csdn.net/zhmxy555/article/details/8197792 作者:毛星云(浅 ...

  7. linux 易语言窗口程序_浅谈Linux入门的基本知识

    浅谈Linux入门的基本知识 图形模式与文字模式的切换方式Linux预设提供了六个命令窗口终端机让我们来登录. 默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1.tty2 - ...

  8. 袁萌浅谈C919大飞机(二)

    袁萌浅谈C919大飞机(二) 2015年11月2日,C919大飞机从生产线上下来.从此,C919大飞机的机体算是诞生了.至于这个大家伙会不会"飞"起来,当时人们还不知道. 人们的预 ...

  9. Unity渲染(二):Shader着色器基础入门之渲染Image图片

    Unity渲染(二):图片渲染 通过这里,你会学习到怎么将一张图片渲染到UI的Image组件或者SpriteRenderer上,以及透明物体的渲染. 上一章:Unity渲染(一):着色器基础入门之纯色 ...

最新文章

  1. 没学过python、但是还是有公司要-想转行,是要入坑Python还是Java?这问题还用问?...
  2. windows核心编程-第一章 对程序错误的处理
  3. 升级 Impala(翻译)
  4. android 权限自动授权,Android判断是否某个权限是否授权
  5. shell 删除乱码文件
  6. 【python数字信号处理】——线性卷积
  7. python读取数据文件、并把里面的数据变成x的二维坐标_(数据科学学习手札60)用Python实现WGS84、火星坐标系、百度坐标系、web墨卡托四种坐标相互转换...
  8. HDU2153 仙人球的残影【数学计算+水题】
  9. JAVA基础知识|进程与线程
  10. Wi-Fi也有版本号了!
  11. 火车票软件哪个好用_买火车票的软件哪个最好
  12. android x86触屏驱动下载,农步祥作品 - 使用台式机和触摸屏玩Android X86 [Soomal]
  13. Mono.Cecil ReaderParameters
  14. 【深入设计模式】装饰模式—什么是装饰模式?装饰模式在源码中的应用
  15. NPDP产品经理认证:产品开发项目的风险评估
  16. 区块链时代,企业如何构筑竞争力的护城河?
  17. Swift4 2 UITextView基本用法
  18. 精细化运营时代,金融魔镜如何助力各产品线实现业务增长
  19. ERP 基础数据 概念
  20. 交易接口 TradeX-M.lic

热门文章

  1. delphi tdxdbgrid 导出 excel_9个免费的Excel图表工具,1键即可做出高大上图表,月薪3万没问题...
  2. matlab loopcount,求助一个数值积分问题,用matlab的quadgk函数来计算,谢谢!
  3. LeetCode 726. 原子的数量
  4. 【软件构造】(转) 设计模式
  5. 删除表空间联带数据文件
  6. 算法基础:最大递减数问题(Golang实现)
  7. HDU 4930 Fighting the Landlords(扯淡模拟题)
  8. Android中关于线性布局基线对齐的讲述
  9. android 播放MP3实例
  10. apache安全—用户访问控制