本文由博主(国宝大熊猫)原创,转载请注明出处: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. 执行automake时报错 error while making link: Operation not supported

    执行automake时报错: [root@localhost project]# automake --add-missingconfigure.in: installing `./install-s ...

  2. 如何判断一个请求为ajax请求?

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和XML). ajax的请求头如下: 如上图所示具有“X-Request-With”属性,该 ...

  3. 124、@JavascriptInterface

    targetSdkVersion 是设置希望的SDK版本,如果设置了此属性,那么在程序执行时,如果目标设备的API版本正好等于此数值,他会告诉Android平台:此程序在此版本已经经过充分测,没有问题 ...

  4. WP8.1学习系列(第十八章)——Windows Phone 交互和可用性

    本主题讨论了布局会对应用的可用性产生怎样的影响.在应用的可用性上下文中还讨论了其他常用 UI,例如搜索和设置. 在继续使用控件和交互之前,请执行以下操作: 有关概念化应用的策略,请参阅尽你所能,设计最 ...

  5. 国内首款 FPGA 云服务器,性能是通用 CPU 服务器 30 倍以上

    版权声明:本文由薛梁原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/628340001485134638 来源:腾云阁 ht ...

  6. SharpGL学习笔记(九) OpenGL的光照模型, 术语解释

    在3D场景中,每个像素最终显示出来的颜色都是经过大量计算而得到的,其中一些计算是依赖于场景中的光照以及场景中物体对光线的反射和吸收情况. 例如,对于一个红色的物体, 在白色光(白光是红光,绿光和蓝光等 ...

  7. Elasticsearch 学习之配置文件详解

    Elasticsearch配置文件##################### Elasticsearch Configuration Example ##################### # # ...

  8. 题目1456:胜利大逃亡(广度优先搜索BFS)

    题目链接:http://ac.jobdu.com/problem.php?pid=1456 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  9. sencha touch Container

    Container控件是我们在实际开发中最常用的控件,大部分视图控件都是继承于Container控件,了解此控件能帮我们更好的了解sencha touch. layout是一个很重要的属性,能够帮助你 ...

  10. wps插件开发中com组件权限

    需要对wps写一个小的插件,也就是几行代码的事情,但却碰到了一个坑 wps中的com组件的调用和MSoffice非常的相似,几乎只需要把包的头修改一下就可以用了. 比如开发wps文档的插件,需要引用 ...