Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置、法线、UV等),索引(顶点如何组成三角形),变换(就是物体的位置、旋转、缩放、以及摄像机位置等),相关光源,纹理,渲染方式(由材质/Shader决定)等数据准备好,然后通知图形API——或者就简单地看作是通知GPU——开始绘制,GPU基于这些数据,经过一系列运算,在屏幕上画出成千上万的三角形,最终构成一幅图像。

在Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。这一过程是逐个物体进行的,对于每个物体,不只GPU的渲染,引擎重新设置材质/Shader也是一项非常耗时的操作。因此每帧的Draw Call次数是一项非常重要的性能指标,对于iOS来说应尽量控制在20次以内,这个值可以在编辑器的Statistic窗口看到。

Unity内置了Draw Call Batching技术,从名字就可以看出,它的主要目标就是在一次Draw Call中批量处理多个物体。只要物体的变换和材质相同,GPU就可以按完全相同的方式进行处理,即可以把它们放在一个Draw Call中。Draw Call Batching技术的核心就是在可见性测试之后,检查所有要绘制的物体的材质,把相同材质的分为一组(一个Batch),然后把它们组合成一个物体(统一变换),这样就可以在一个Draw Call中处理多个物体了(实际上是组合后的一个物体)。

但Draw Call Batching存在一个缺陷,就是它需要把一个Batch中的所有物体组合到一起,相当于创建了一个与这些物体加起来一样大的物体,与此同时就需要分配相应大小的内存。这不仅会消耗更多内存,还需要消耗CPU时间。特别是对于移动的物体,每一帧都得重新进行组合,这就需要进行一些权衡,否则得不偿失。但对于静止不动的物体来说,只需要进行一次组合,之后就可以一直使用,效率要高得多。

Unity提供了Dynamic Batching和Static Batching两种方式。Dynamic Batching是完全自动进行的,不需要也无法进行任何干预,对于顶点数在300以内的可移动物体,只要使用相同的材质,就会组成Batch。Static Batching则需要把静止的物体标记为Static,然后无论大小,都会组成Batch。如前文所说,Static Batching显然比Dynamic Batching要高效得多,于是,Static Batching功能是收费的……

要有效利用Draw Call Batching,首先是尽量减少场景中使用的材质数量,即尽量共享材质,对于仅纹理不同的材质可以把纹理组合到一张更大的纹理中(称为Texture Atlasing)。然后是把不会移动的物体标记为Static。此外还可以通过CombineChildren脚本(Standard Assets/Scripts/Unity Scripts/CombineChildren)手动把物体组合在一起,但这个脚本会影响可见性测试,因为组合在一起的物体始终会被看作一个物体,从而会增加GPU要处理的几何体数量,因此要小心使用。

对于复杂的静态场景,还可以考虑自行设计遮挡剔除算法,减少可见的物体数量同时也可以减少Draw Call。

总之,理解Draw Call和Draw Call Batching原理,根据场景特点设计相应的方案来尽量减少Draw Call次数才是王道,其它方面亦然。

转载于:https://www.cnblogs.com/wonderKK/p/3918052.html

(转)Unity3D - 性能优化之Draw Call相关推荐

  1. Unity3D性能优化之Draw Call Batching

    在屏幕上渲染物体,引擎需要发出一个绘制调用来访问图形API(iOS系统中为OpenGL ES).每个绘制调用需要进行大量的工作来访问图形API,从而导致了CPU方面显著的性能开销. Unity在运行时 ...

  2. Unity3D性能优化

    官方优化文档--优化图像性能 http://docs.unity3d.com/Documentation/Manual/OptimizingGraphicsPerformance.html Unity ...

  3. Unity3D性能优化——工具篇

    Quote from:https://zhuanlan.zhihu.com/p/39529241 性能优化是游戏项目开发中一个重要且必须的元素.用户和项目的需求在并且会持续增长.而即便在硬件设备高速发 ...

  4. Unity3D性能优化 之 内存优化篇

    性能优化主要围绕CPU.GPU和内存三大方面 之 内存优化篇 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重. 然而,在我们测评过的大量项目中,90%以上的项目都存在不同程度的内存使用问题. ...

  5. Unity3d 性能优化篇

    一.遇到麻烦时要调用"垃圾回收器"(Garbage Collector,无用单元收集程序,以下简称GC)** 由于具有C/C++游戏编程背景,我们并不习惯无用单元收集程序的特定行为 ...

  6. Unity3D性能优化总结(转纳金网)

    一.程序方面 01.务必删除脚本中为空或不需要的默认方法: 02.只在一个脚本中使用OnGUI方法: 03.避免在OnGUI中对变量.方法进行更新.赋值,输出变量建议在Update内: 04.同一脚本 ...

  7. 深入浅出聊Unity3D项目优化:从Draw Calls到GC (难度2 推荐5)

    原文出处: 慕容小匹夫的博客(@慕容小匹夫) 前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章,而且陈述的都是既有的事实, ...

  8. 移动平台Unity3D 应用性能优化

    WeTest 导读 做了大概半年多VR应用了,VR由于双眼double渲染的原因,对性能的优化要求比较高,在项目的进展过程中,总结了一些关于移动平台上Unity3D的性能优化经验,供分享. 一.移动平 ...

  9. Unity3D图形性能优化

    图形性能优化 图形开销在哪里 游戏的图形显示部分主要消耗计算器的两个系统:GPU和CPU.任何优化的第一规则都是查明性能瓶颈在哪里,因为优化GPU和优化CPU的策略常常是不同的(甚至常常是相互对立的- ...

最新文章

  1. System.currentTimeMillis()用法及其计算方式与时间的单位转换
  2. 53-java中的queue
  3. [C#.NET 拾遗补漏]09:数据标注与数据校验
  4. GitLab五种权限
  5. Android中如何查看内存(下)
  6. 正规的IT外包公司的报价组成
  7. 哒螨灵使用注意事项_哒螨灵怎么使用?哒螨灵的使用方法和注意事项
  8. 你为你的BLOG找了经纪人了吗?
  9. 文字生成图片html,根据文字生成图片
  10. lumen php命令,lumen添加artisan 命令方法
  11. slack下载 csdn、_找出老板是否可以下载Slack DM
  12. vs2017 - vs2012
  13. 非2的幂,离散傅里叶变化DFT的快速实现
  14. 领英精灵和领英助理哪个好,为什么领英精灵会成为领英最好的辅助工具。置顶收藏
  15. MySQL数据库日志详解
  16. 如何引流购物粉?如何引流网购粉?怎么吸购物粉?
  17. CEO、CFO、CTO、COO...那CRO是什么?
  18. 成绩分析系统c语言实验报告,学生成绩管理系统实验报告
  19. 群发淘宝消息 另外的思路 使用 UI Automation 和 api
  20. 英特尔称CPU超过10核没什么用,暗讽AMD胶水多核

热门文章

  1. Linux数组计算平均值,从数组中读取并计算平均值
  2. 百度语音合成 js html,Node.js结合百度TTS接口实现文字转语音功能
  3. append从一个添加到另一_真特么激动第一个爬虫----爬取豆瓣电影top250
  4. python 点云las、laz文件的读取、写入、压缩
  5. 图像识别-opencv
  6. list mybatis 接收 类型_基于mybatis拦截器实现的一款简易影子表自动切换插件
  7. 嵌入式linux结构框图,嵌入式linux系统的结构
  8. vscode 配置 Latex 编译后自动清理多余文件(.log .out等文件)
  9. c++ std::priority_queue优先队列
  10. C++11之final关键字