本文由博主(国宝大熊猫)原创,转载请注明出处:http://www.cnblogs.com/xsln/p/5151951.html
知识普及
     *Drawcall影响的是CPU的效率。因为draw call是CPU调用图形接口在屏幕上绘制对应的东西。
   
主体: 
     为了在屏幕上draw一个物件(因为render和draw有些区别,所以为了区分清楚,这些概念用英文),引擎需要提供一个draw call的API。draw call调用性能开销是很大的,会导致CPU部分的性能负载。这通常是因为draw call间的状态改变(例如不同材质间的切换)导致,因为这些行为会导致显卡驱动进行开销很大的验证和转化步骤。
    Unity用static batch来处理这件事情。static batch的目的是为了用尽可能少的缓冲区来重组尽可能多的mesh,从而获得更好的性能。因而static batch会出现一些巨大的mesh被渲染,而不是很多的小mesh被渲染。合并后的这些资源虽然在不同的地方出现,但是Unity会认为是同样的资源(因为这些小资源已经合并了)来循环进行渲染。它会为每个static bached mesh来做一系列的快速的draw call。
    构建时做batch,在Unity5中只有一种方式,会构建index buffer, 然后一个draw call会被提交来用来处理合并的mesh里的每个可见的子mesh
 
材质
    只有使用同样材质的物件才能够合并。因而,如果你想获得好的合并效果,你需要尽可能多的使不同的物件贡献同样的材质。
    如果你有两个典型的材质,它们仅仅只是贴图不同,你可以合并这些贴图到一个大的贴图里----这个过程通常叫做texture atlasing(也就是图集)。一旦贴图在同一个图集里,你就能只使用一个材质来代替。
    *texture atlasing可参见以下网页https://en.wikipedia.org/wiki/Texture_atlas
    如果你需要从脚本里获得共享重用的材质属性,你要注意修改Rendering.material将会创建这个材质的拷贝。因而你需要使用Renderer.sharedMaterial来获取找个共享的材质。
 
Static Batching(静态批次)
    静态批次,对于没有移动且公用材质的物件,能有效减少drawcall。一般来说,静态批次比动态批次更有效,但它会占用更多的内存,也会消耗更少的CPU。
    为了达到静态批次的效果,你需要显式的注明哪些物件是静态的,不移动,不旋转也不缩放的。你可以通过下面的方式来表明使用静态批次:
     
    使用静态批次,需要额外的内存来存储合并的图形。如果一些物件使用的是同一份几何图形,做静态批次后,每个物件都会创建一份几何图形,无论是在编辑器还是运行时。这不是个好的方案,因此有时不得不避免采用静态批次(虽然会损失渲染的性能),但是可以保持一个较小的内存。例如,在一个密集的森林里把树都标记成需要静态批次的,会有严重的内存影响。
    静态批次是通过转换一堆的静态物件到世界坐标系,来构建一个大的顶点和索引buffer。可见的物件在同一个静态批次,而且不会有状态的切换(状态切换的代价是很大的)
 
Dynamic Batching(动态批次)
    当物件使用相同的材质,并且满足一定的条件时,Unity会自动合并物件来减少draw call。Dynamic batching 是自动做的,不需要教你做其他的事情。
 
Tips:
    *Batching动态物件会给个顶点增加额外的开销,所以batch只适用于所有mesh合起来少于900个顶点的情况
          **如果你的shader用的是vertex position, normal和 single UV,你能合并300个顶点;如果你的shader用的是vertex position ,normal, UV0, UV1和Tangent,只能达到180个
          **PS:这条Unity5的规则数目新的版本里有可能会变
 
    *一般来说,物件应该使用相同的trasform scale。
          **对于不规则缩放的物件除外;如果一些物件有自己的不同的不规则的transform,他们还是会被batch的
 
    *用不同的材质实例,会导致物件不被batch(即便这些材质实例实际上是相同的)
 
    *使用光照图的物件会有额外的渲染参数:包括光照图的索引、相对光照图缩放和偏移。最好动态的光照图的物件能指向同一个光照图的位置,这样可以batch
 
    *接收实时阴影的物件不会batch
 
    *多通道的shader会破坏batch。几乎unity中所有的着色器在前向渲染中都支持多个光源,并为它们有效地开辟多个通道。为了“额外的每个像素光照”的draw call是不会batch的
 
Other batching tips
    目前,只有Mesh Render和粒子系统被batch。其他的组件(如skin mesh, 布料)都不会被batch。另外半透明的shader因为要渲染半透明的效果常常要求物件是从后往前来绘制。Unity会按照这个顺序给物件排序,然后再尝试batch他们。但是因为顺序是严格要求的,所以半透明的物件能被batch的效果远不如不透明的物件。
    一些Unity的render不能被batch。比如shadow casters,摄像机的深度图和GUI都会batch.
 
 

Unity优化----drawcall系列的更多相关文章

  1. [Unity优化] Unity CPU性能优化

    前段时间本人转战unity手游,由于作者(Chwen)之前参与端游开发,有些端游的经验可以直接移植到手游,比如项目框架架构.代码设计.部分性能分析,而对于移动终端而言,CPU.内存.显卡甚至电池等硬件 ...

  2. PLSQL_性能优化工具系列16_Best Practices: Proactively Avoiding Database

    占位符 PLSQL_性能优化工具系列_Best Practices: Proactively Avoiding Database/Query Performance Issue

  3. 【Unity优化】构建一个拒绝GC的List

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 上篇文章<[Unity优化]Unity中究竟能不能使用foreach?> ...

  4. 再议Unity优化

    0x00 前言 在很长一段时间里,Unity项目的开发者的优化指南上基本都会有一条关于使用GetCompnent方法获取组件的条目(例如14年我的这篇博客<深入浅出聊Unity3D项目优化:从D ...

  5. UNITY 优化之带Animator的Go.SetActive耗时问题,在手机上,这个问题似乎并不存在,因为优化了后手机上运行帧率并未明显提升

    UNITY 优化之带Animator的Go.SetActive耗时问题,在手机上,这个问题似乎并不存在,因为优化了后手机上运行帧率并未明显提升 经确认,这个问题在手机上依然存在,不过占的比例非常小.因 ...

  6. 面向英特尔® x86 平台的 Unity* 优化指南: 第 1 部分

    原文地址 目录 工具 Unity 分析器 GPA 系统分析器 GPA 帧分析器 如要充分发挥 x86 平台的作用,您可以在项目中进行多种性能优化,以最大限度地提升性能. 在本指南中,我们将展示 Uni ...

  7. (转载)Unity 优化总结

    Unity 优化总结 2017-03-10 | 发布 大海明月  zengfeng75@qq.com  | 分类 Unity  | 标签 Unity  优化 相关文档 UGUI 降低填充率技巧两则 U ...

  8. MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题

    我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...

  9. Unity优化之减少Drawcall

    简单来说,Drawcall就是屏幕渲染一次所需要的开销,为了较少消耗,提高性能,一般有以下几种方法. 一: 批处理 1.动态批处理 如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处 ...

随机推荐

  1. C语言字节对齐问题详解

    引言 考虑下面的结构体定义: typedef struct{ char c1; short s; char c2; int i; }T_FOO; 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始 ...

  2. 二分法求平方根(Python实现)

    使用二分法(Bisection Method)求平方根. def sqrtBI(x, epsilon): assert x>0, 'X must be non-nagtive, not ' + ...

  3. [PHP] Compile an extension on Windows

    https://wiki.php.net/internals/windows/stepbystepbuildhttp://blog.benoitblanchon.fr/build-php-extens ...

  4. Oracle 学习之 Select 1

    1. select 1 from table           增加临时列,每行的列值是写在select后的数,这条sql语句中是1,若select后为2,则是每行为2的列 2:select cou ...

  5. LeetCode 37 Sudoku Solver(求解数独)

    题目链接: https://leetcode.com/problems/sudoku-solver/?tab=Description   Problem : 解决数独问题,给出一个二维数组,将这个数独 ...

  6. LeetCode 17 Letter Combinations of a Phone Number (电话号码字符组合)

    题目链接 https://leetcode.com/problems/letter-combinations-of-a-phone-number/?tab=Description HashMap< ...

  7. ZOJ 3435 Ideal Puzzle Bobble

    ZOJ Problem Set - 3435 Ideal Puzzle Bobble Time Limit: 2 Seconds      Memory Limit: 65536 KB Have yo ...

  8. 利用bat批处理做启动mongodb脚本

    文章开始,我们先回顾一下,如何用cmd命令窗口开启mongodb数据库,命令如下: 开启mongodb数据库 cd D:\Program Files\MongoDB\bin mongod --depa ...

  9. R的any和all

    > x<-1:10 > any(x>8) [1] TRUE > all(x>8) [1] FALSE

  10. 9.6Django

    2018-9-6 12:56:32 2018-9-6 18:32:22 把那个用户列表的页面优化了一下!用了老师更好看的页面,但是功能还是那些! 就是修改一下url就好! 放在我我的github  : ...