本文由博主(国宝大熊猫)原创,转载请注明出处: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++标准程序库》笔记之四

    本篇博客笔记顺序大体按照<C++标准程序库(第1版)>各章节顺序编排. ---------------------------------------------------------- ...

  2. django初体验 学习笔记

    django环境搭建     1.安装Python     2.ipython         sudo apt-get install ipython         sudo pip instal ...

  3. Jquery-无法有效获取当前窗口高度

    今天碰到个很奇怪的事情,那就是滚动条往下滚动时候没有触发提示,反而是往上滚动的时候,触发了提示.百思不得其解,尤其是拿了美工大大的切图过来,一点问题都没有. 那么就进行console.log输出查看了 ...

  4. KindEditor上传图片无法使用绝对路径

    之前百度,一直查到的都是urlType使用domain,但是根本没有效果.想着去插件代码里面看,但是实在看不下去了. 最后还是百度去了.然后查到下面的一个方法.直接将其中的某部分代码注释到就好了.具体 ...

  5. .net写入文本到本地

    using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"d:\test\ErrorLog.txt", t ...

  6. SQL SERVER 2008 R2安全配置与防暴力破解

    https://blog.csdn.net/enweitech/article/details/49864215 0x00 sql server 2008 权限介绍 在访问sql server 200 ...

  7. vim 正则替换【转】

    :[range]s/from/to/[flags] range:搜索范围,如果没有指定范围,则作用于但前行. :1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换: ...

  8. 【CSS系列】获取实时数据做进度

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 使用virtualbox 配置 linux host-only虚拟主机连接外网(转载)

    host-only 下的虚拟机之间可以互相访问,虚拟机和宿主机可以互相访问,但是虚拟机不能访问外网. 需要设置: 1.宿主机设置 先对宿主机(windows机器,我这里是win7系统)进行相关配置. ...

  10. create-react-app中img图片不现实

    场景:正常的情况下是这么引用图片,我的图片路径是 src/images/login-from-icon1.png <img src="../images/login-from-icon ...