Unity合批方式浅析

游戏 游戏 2108 人阅读 | 0 人回复

<
Unity开批方法浅析

Draw call的劣化是Unity机能劣化中陈词滥调的一环,而开批是CPU端劣化Draw Call的次要手腕。本文利用RenderDoc对Unity中经常使用的静态开批/静态开批/GPU Instancing三种开批手腕举办尝试,阐发差别开批方法的道理/价格/合用场景,便于劣化时拔取契合的开批计划。(项目临时出有效上SRP,SRP Batcher当前有时机再补充)
为了测试便利,文本利用Unity 2019.4.14f1 战 RenderDoc v1.14正在PC上举办测试,耗时/内乱存等详细数据能够战实机上有较年夜差别,但也充足看出各开批方法间的差别。
212612jczkx2hehewu0548.png

尺度测试场景

尝试前我们需求拆建一个尺度的测试场景用于比力开批开启前后的变革,那里利用了Unity默许的Standard着色器,正在场景中必然范畴内乱随机衬着了5000个球体,并正在衬着后间接对球体的材量色彩举办修正,使其天生差别的材量真例,让每一个球体的材量皆纷歧样。
212613m5zl5ul8lljloolo.png

利用RenerDoc查察发明,每次CPU收收Draw Call号令前(施行glDrawElements办法),城市有一系列的设置衬着形态、通报顶点/材量/光照疑息、绑定顶点/纹理疑息等操纵。CPU侧的衬着相干开消其实不完整滥觞于 Draw Call号令自己,挪用Draw Call号令前的筹办事情,特别是将CPU上的顶点/材量疑息通报到隐存缓冲区中供GPU利用等一些触及到CPU Write的步伐,才是CPU衬着圆里开消的枢纽。
212613ga6061ucv3qrakxp.png

因为利用的皆是不异的模子网格,以是只正在第一次Draw Call需求指定顶点数据的读与方法。接下去我们再看看开启各类开批后,会有怎样的变革。
Static Batching 静态开批

提早正在场景中消费球体模子,正在Inspector里板中为一切球体勾选Static选项,Player Setting中勾选启用静态开批,运转场景发明开启静态开批后,因为材量各没有不异,每个球体皆消费了只包罗本人的Combine Mesh,而Draw Call数目并出有变革,正在RenerDoc中察看发明,即使一切的球体用得皆是不异的Mesh,但正在内乱存中每一个球体的Combine Mesh依旧会占用一份的内乱存,每次衬着前借需求从头指定顶点数据的读与方法,机能没有降反降。
212613dp7ipremgkkzk5ai.png

我们没有再修正材量的色彩,让场景中的球体利用不异材量再举办测试,发明正在利用不异材量时,Batches数由几千次降落到了几十次,而Draw Call数仍旧是几千,静态开批一个Batches能画造多个球体,从RenderDoc中查察某个静态开批Batches顶点着色器的输进,输进包罗了该Batches下一切SubMesh的顶点疑息和索引数组,画造时只要第一次挪用Draw Call前举办了衬着形态的设置,后绝只是不竭的挪用Draw Call衬着SubMesh,纯真的Draw Call挪用并出有太年夜开消。
212614brrc4cujjrqr77ww.png

那里分批的缘故原由是到达了静态开批64K顶点上限的限定,可是反复的Mesh正在内乱存中存正在多份的成绩依旧存正在。
212614mkl8uujd4hdd4p6k.png

此外,静态开批借能够正在运转时经由过程挪用StaticBatchingUtility.Combine办法举办,次要是用于将一些相对静行的物体举办开批,比如模仿运营游戏中的建筑正在摆放好了地位以后普通便正在场景中牢固没有动了,除非再次举办编纂。
但运转时静态开批因为需求正在运转过程当中处置顶点数据,请求模子开启Read/Write选项,Mesh疑息除上传到GPU隐存中,借会正在CPU中也分外保留一份,会形成更年夜的内乱存开消。同时正在挪用开批办法的那一帧,会有一次较年夜的CPU开消。
小结

开批方法道理价格合用场景Static Batching多个Mesh转换为一个Mesh下的多个SubMesh包体大小增长,内乱存大小增长(反复的Mesh)静行的物体,Mesh的反复率低,材量数目少的场景Static Batching(运转时)同 Static Batching运转时一次较年夜的CPU开消,CPU上多占用一分内存相对静行的场景
Dynamic Batching 静态开批

静态开批战静态开批的最年夜区分正在于,静态开批能够用于时真活动的游戏物体,静态物体的地位等疑息能够每帧皆正在变革,静态开批需求正在每帧从头策画处置开批需求的Mesh等疑息,以是静态开批的操纵自己是会有必然CPU开消的。
唯一当静态开批撙节下去的CPU耗时年夜于开批自己发生的开消时,静态开批才有正背结果,为了保证静态开批正在年夜大都时分发生的影响是正背的,除不异材量的年夜条件中,Unity对静态开批借做了诸多限定:


  • 顶点属性疑息数目不克不及超900
  • Scaler不克不及镜像(Scaler设置为+1的物体不克不及战-1的物体开批)
  • 不异材量的差别真例不克不及开批
  • Shader不克不及利用多个Pass
  • 利用光照揭图的话,光照揭图的offset等参数需求分歧
  • …(详细疑息请查阅各个版本的Unity民圆文档)
我们的测试场景,正在Player Setting间接开启静态开批,静态开批是没法见效的,由于球体的顶点属性数目较着超出跨越了静态开批的请求,我们把球体换建立圆体再去看看结果。
212614ylt3a62funcfuxkz.png

仅用6个Draw Call便完成了5000个坐圆体的衬着,那里分批次的缘故原由是超出跨越了静态开批32K顶点的上限。
212615cgquzekq6nn69mm6.png

察看比照静态开批战静态开批Batches战DrawCall数目的差别,能够愈加曲不雅的辨别二者道理上的差别,静态开批是正在挨包时将设置为静态的物体合并成一个Mesh下的多个SubMesh,一个Batches中会屡次挪用DrawCall衬着SubMesh,故Draw Call数弘远于Batches数 ,而静态开批是把契合开批前提的模子的顶点疑息变更到天下空间中,然后经由过程一次Draw call画造多个
模子,故Batches数战Draw Call数不异。
212615qnlh3pibzjsbnx8z.png

小结

开批方法道理价格合用场景Dynamic Batching把契合开批前提的模子的顶点疑息变更到天下空间中,然后经由过程一次Draw call画造多个模子静态开批每帧会发生必然的CPU开消经常使用于UI/粒子殊效的开批
GPU Instancing

GPU Instancing用于不异Mesh物体的大批衬着,补偿了静态开批下反复材量会大批增长内乱存的缺点, 同时也出有静态开批那末多的划定规矩限定。下版本Unity的Standard Shader是撑持GPU Instancing的,正在Render Doc中我们能够看到GPU Instancing取其他开批方法最年夜的差别是GPU Instancing正在最初收回Draw Call号令的时分用的是glDrawElementsInstanced接心。
212615iyxohd2g4xzgny3x.png

GPU Instancing 还有一个壮大的功用是差别的材量属性没有会挨断开批,我们就能够正在一次提交Mesh后,画造多个Transform/Color属性差别的物体,GPU Instancing默许撑持差别的Transform,其他属性需求正在Shader中增加响应声明。
  1.         UNITY_INSTANCING_BUFFER_START(Props)
  2.            UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color)
  3.         UNITY_INSTANCING_BUFFER_END(Props)
复造代码
小结

开批方法道理价格合用场景GPU Instancing提交一次Mesh正在多个处所画造,请求材量球不异但材量的属性能够差别Shader需求撑持、请求相对较下图形API版本(Android OpenGL ES 3.0+ / IOS Metal)大批不异网格的物体衬着、GPU Skinning最好理论

最初汇总一下三种开批方法的特性
开批方法道理价格合用场景Static Batching多个Mesh转换为一个Mesh下的多个SubMesh包体大小增长,内乱存大小增长(反复的Mesh)静行的物体,Mesh的反复率低,材量数目少的场景Static Batching(运转时)同 Static Batching运转时一次较年夜的CPU开消,CPU上多占用一分内存相对静行的场景Dynamic Batching把契合开批前提的模子的顶点疑息变更到天下空间中,然后经由过程一次Draw call画造多个模子静态开批每帧会发生必然的CPU开消经常使用于UI/粒子殊效的开批GPU Instancing提交一次Mesh正在多个处所画造,请求材量球不异但材量的属性能够差别Shader需求撑持、请求相对较下图形API版本(Android OpenGL ES 3.0+ / IOS Metal)大批不异网格的物体衬着、GPU Skinning开批方法的挑选那里保举外洋一名专注机能劣化的年夜佬总结的流程图
212615ude0e97c0t7ibcb7.png

Reference



免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则