本文由博主(国宝大熊猫)原创,转载请注明出处: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. oracle如何链接到另外一个数据库DB_LINK

    命令创建从一个库连接的另外一个库: create database link DB_XXX  --创建连接的名字connect to db_xxx --数据库名identified by DB-XXX ...

  2. 查看sql server日志

    如果是查询当前已经连接到服务器的用户 select loginame, * from master.dbo.sysprocesses 查看sql 的操作日志记录 SELECT * From ::fn_ ...

  3. intellij中使用git插件将项目上传到码云

    参考帖子: git上传本地Intellij idea 项目到码云的git仓库中(评论中有彩蛋,一定要看) IntelliJ-IDEA和Git.GitHub.Gitlab的使用 使用idea上传项目到码 ...

  4. epoll实现机制分析

    本文只介绍epoll的主要流程而不是分析源代码,如果需要了解更多的细节可以自己翻阅相关的内核源代码. 相关内核代码: fs/eventpoll.c 判断一个tcp套接字上是否有激活事件:net/ipv ...

  5. Apache Server Status详解

    Apache的日志如果靠分析日志或者查看服务器进程来监视Apache运行状态的话,比较繁冗.不过在Apache 1.3.2及以后的版本中就自带一个查看Apache状态的功能模块server-statu ...

  6. 【CF802L】Send the Fool Further! (hard) 高斯消元

    [CF802L]Send the Fool Further! (hard) 题意:给你一棵n个节点的树,每条边有长度,从1号点开始,每次随机选择一个相邻的点走,走到一个叶子时就停止,问期望走的总路程. ...

  7. 【CF896E】Welcome home, Chtholly 暴力+分块+链表

    [CF896E]Welcome home, Chtholly 题意:一个长度为n的序列ai,让你支持两种操作: 1.l r x:将[l,r]中ai>x的ai都减去x.2.l r x:询问[l,r ...

  8. numpy中的reshape中参数为-1

    上篇文章中的reshape(-1,2),有的时候不明白为什么会有参数-1,可以通过查找文档中的reshape()去理解这个问题 根据Numpy文档(https://docs.scipy.org/doc ...

  9. Asp.net MVC]Asp.net MVC5系列——在模型中添加

    目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...

  10. Zabbix显示乱码解决办法

    Zabbix在web页面会显示乱码,如下图所示 在windows下面文件夹C:\Windows\Fonts找一个简体字文件例如simkai.ttf 复制到zabbix server的文件夹/usr/s ...