减少DrawCall数目

最常见的优化技术——批处理。实现原理为减少渲染每一帧所需的drawcall数目。使用同一个材质的物体可以一起处理。

优点 缺点
动态批处理 切处理都是Unity 自动完成的,不需要我们自己做任何操作,而且物体是可以移动的 限制很多,可能一-不小心就会破坏了这种机制,导致Unity无法动态批处理一些使用了相同材质的物体
静态批处理 自由度很高,限制很少 可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动

1 动态批处理

如果场景中有一些模型共享了同一个材质并满足一些条件,Unity就可以自动把它们进行批处理,从而只需要花费一个draw call就可以渲染所有的模型。动态批处理的基本原理是,每一帧把可以进行批处理的模型网格进行合并,再把合并后模型数据传递给GPU,然后使用同一个材质对其渲染。除了实现方便,动态批处理的另一个好处是,经过批处理的物体仍然可以移动,这是由于在处理每帧时Unity都会重新合并一次网格。

条件限制:

  • 能够进行动态批处理的网格的顶点属性规模要小于900。
  • 一般来说,所有对象都需要使用同一个缩放尺度,但在Unity5中,这种对模型缩放的限制已经不存在了。
  • 使用光照纹理(lightmap)的物体需要小心处理。因此,为了让这些物体可以被动态批处理,我们需要保证它们指向光照纹理中的同一个位置。
  • 多Pass的shader会中断批处理。

要渲染这样一个包含了4个物体的场景共需要两个批处理。其中,一个批处理用于绘制经过动态批处理合并后的3个立方体网格,另一个批处理用于绘制球体。我们可以从Save by batching看出批处理帮我们节省了两个draw call。

现在,我们再向场景中添加一个点光源,并调整它的位置使它可以照亮场景中的4个物体。由于场景中的物体都使用了多个Pass的shader,因此,点光源会对它们产生光照影响。

渲染一帧所需的批处理数目增大到了8,而Save by batching的数目也变成了0。这是因为,使用了多个Pass的shader在需要应用多个光照的情况下,破坏了动态批处理的机制,导致Unity不能对这些物体进行动态批处理。而由于平行光和点光源需要对4个物体分别产生影响,因此,需要2x4个批处理操作。需要注意的是,只有物体在点光源的影响范围内,Unity 才会调用额外的Pass来处理它。因此,如果场景中点光源距离物体很远,那么它们仍然会被动态批处理的。

2 静态批处理 

Unity提供了另一种批处理方式,即静态批处理。相比于动态批处理来说,静态批处理适用于任何大小的几何模型。它的实现原理是,只在运行开始阶段,把需要进行静态批处理的模型合并到一个新的网格结构中,这意味着这些模型不可以在运行时刻被移动。但由于它只需要进行一次合并操作,因此,比动态批处理更加高效。

尽管3个Teapot模型使用了相同的材质,但它们仍然没有被动态批处理。这是因为,Teapot 模型包含的顶点数目是393,而它们使用的shader 中需要使用4个顶点属性(顶点位置、法线方向、切线方向和纹理坐标),超过了动态批处理中限定的900限制。此时,要想减少drawcall就需要使用静态批处理。

静态批处理的实现非常简单,只需要把物体面板上的Static复选框勾选上即可。

现在的批处理数目变成了2,而Save by batching数目也显示为2。此时,如果我们在运行时查看每个模型使用的网格,会发现它们都变成了一一个名为Combined Mesh (roo:scene)的东西。这个网格是Unity 合并了所有被标识为“Static" 的物体的结果,在我们的例子里,就是3个Teapot和一个立方体。这个合并后的网格其实包含了4个子网格,即场景中的4个对象。对于合并后的网格,Unity 会判断其中使用同一个材质的子网格,然后对它们进行批处理。

 如果场景中包含了除了平行光以外的其他光源,并且在shader中定义了额外的Pass来处理它们,这些额外的Pass部分是不会被批处理的。但是,处理平行光的Base Pass部分仍然会被静态批处理,因此,我们仍然可以节省两个draw call。

3 共享材质

无论是动态批处理还是静态批处理,都要求模型之间需要共享同一个材质。但不同的模型之间总会需要有不同的渲染属性,如果两个材质之间只有使用的纹理不同,我们可以把这些纹理合并到一张更大的纹理中,这张更大的纹理被称为是一张图集(atlas)。 一旦使用了同一张纹理,我们就可以使用同一个材质,再使用不同的采样坐标对纹理采样即可。

如果调整微小的参数,如颜色,浮点属性等,一种常用的方法就是使用网格的顶点数据(最常见的就是顶点颜色数据)来存储这些参数。

需要注意的是,如果我们需要在脚本中访问共享材质,应该使用Renderer.sharedMaterial来保证修改的是和其他物体共享的材质,但这意味着修改会应用到所有使用该材质的物体上。另一个类似的API是Renderer.material,如果使用Renderer.material 来修改材质,Unity会创建一个该材质的复制品,从而破坏批处理在该物体上的应用,这可能并不是我们希望看到的。

4 注意事项

  1. 尽可能选择静态批处理,但得时刻小心对内存的消耗,并且记住经过静态批处理的物体不可以再被移动。
  2. 如果无法进行静态批处理,而要使用动态批处理的话,那么请小心上面提到的各种条件限制。例如,尽可能让这样的物体少并且尽可能让这些物体包含少量的顶点属性和顶点数目。
  3. 对于游戏中的小道具,例如可以捡拾的金币等,可以使用动态批处理。
  4. 对于包含动画的这类物体,我们无法全部使用静态批处理,但其中如果有不动的部分,可
    以把这部分标识成“Static"。

由于批处理需要把多个模型变换到世界空间下再合并它们,因此,如果shader中存在一些基于模型空间下的坐标的运算,那么往往会得到错误的结果。

一个解决方法是,在shader中使用DisableBatching标签来强制使用该Shader的材质不会被批处理。

另一个注意事项是,使用半透明材质的物体通常需要使用严格的从后往前的绘制顺序来保证透明混合的正确性。对于这些物体,Unity 会首先保证它们的绘制顺序,再尝试对它们进行批处理。这意味着,当绘制顺序无法满足时,批处理无法在这些物体上被成功应用。

UnityShader入门精要——Unity中的渲染优化技术(二)相关推荐

  1. UnityShader入门精要——Unity中的渲染优化技术(三)

    减少需要处理的顶点数目 1 优化几何体 尽可能减少模型中三角面片的数目,一些对于模型没有影响.或是肉眼非常难察觉到区别的顶点都要尽可能去掉. 移除不必要的硬边以及纹理衔接,避免边界平滑和纹理分离. 2 ...

  2. 第16章 Unity中的渲染优化技术

    程序优化的第一条准则: 不要优化.程序优化的第二条准则(仅针对专家! 〉: 不要优化. 一一Michael A. Jackson 在进行程序优化的时候,人们经常会引用英国的计算机科学家Michael ...

  3. unity中的渲染优化技术

    1.CPU 过多的drawCall 使用批处理技术来减少drawCall数目 复杂的脚本或者物理模拟 2.GPU 顶点处理 减少顶点数 优化几何体 使用Lod技术 使用遮挡剔除技术 过多的顶点 过多的 ...

  4. Unity性能优化要点分析(二) 渲染优化技术

    本章摘录自UnityShader入门精要的第16章内容. 移动平台的特点 移动平台的GPU架构有很大不同,由于芯片架构的不同,一些游戏往往需要针对不同的芯片发布不同的版本,以便对每种芯片进行更有针对性 ...

  5. 《UnityShader入门精要》总结(1)理论篇

    紫色:大类概念或简短有力的总结 蓝色:细分概念或重要部分 红色:重要的补充注释 第二章:渲染流程与流程分工 渲染的流程分三个阶段: 应用阶段(开发者控制阶段) 由开发者全权进行管理,控制场景内摄像机位 ...

  6. UnityShader入门精要-9

    目录 1. Unity的渲染路径 前向渲染路径 Unity中的前向渲染 延迟渲染 Unity的光源类型 Unity的光照衰减 Unity的阴影 1. Unity的渲染路径 Unity 5.0之前,有3 ...

  7. UnityShader入门精要笔记1——顶点/片元着色器结构与BRDF(基本光照模型)——实现漫反射

    文章目录 BRDF(基本光照模型) 实现漫反射 光线强度的计算 好现在开始写Shader 新建Shader 添加一个Properties语义块 添加SubShader和Pass. 使用CG/HLSL语 ...

  8. UnityShader入门精要——消融效果

    消融效果 原理:噪声纹理+透明度测试 使用噪声纹理采样的结果和某个控制消融程度的阈值比较,如果小于阈值,就使用clip函数把它对应的像素裁剪掉,这些部分就对应了图中被"烧毁"的区域 ...

  9. UnityShader入门精要——立方体纹理

    在图形学中,立方体纹理(Cubemap)是环境映射(Environment Mapping)的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层金属一样反射出周围的 ...

最新文章

  1. php双向链表,双向链表的GO语言实现
  2. eeglab中文教程系列(2)-绘制脑电头皮图
  3. 自定义Realm实现认证
  4. 云炬60s看世界20211127
  5. 5.12 QR分解的阻尼倒数法和正则化方法区别
  6. python求正整数的百位部分_Python程序设计课后习题答案
  7. Oracle从零开始3——复杂查询
  8. 使用.NET 5自动查找代码中的潜在错误
  9. 喵哈哈村的魔法考试 Round #14 (Div.2) 题解
  10. 谷歌出品!机器学习常用术语总结
  11. 图的广度优先搜索和深度优先搜索
  12. 计算机桌面有边框阴影,为什么电脑上的所有显示都会有阴影呢?(桌面图标、对话框等)...
  13. 计算机应用苹果笔记,使用感受 篇一:为什么我不推荐ipad+apple pencil记笔记(一反主流)...
  14. 为了研究而玩:游戏分析的方法
  15. 怎么看Mac电脑的序列号,Mac序列号是多少
  16. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) F
  17. 测试用例颗粒度实例列举
  18. 【算法设计与分析】递归与分治 | 复习笔记
  19. Spring系列学习之Spring Cloud Task App Starters 微服务任务进程可执行程序
  20. web开发课程培训,前端开发开发培训

热门文章

  1. 探讨国外网站设计动用的成本,网页设计师必看
  2. C#面向对象简单坦克大战(创意)
  3. 部署ingress-controller,nginx
  4. 武汉流星汇聚:亚马逊无人机配送来临,无人机送货将成为趋势
  5. 《那些年啊,那些事——一个程序员的奋斗史》连载再开感言
  6. Oracle数据库完整卸载
  7. 2020互联互通社区中秋国庆双节盛典
  8. win7计算机安全配置文件,详述Win7安全模式下的多种功能 -电脑资料
  9. 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇
  10. vue插槽面试题_常见的vue面试题