转载请标明出处 http://www.cnblogs.com/zblade/html
最近有一点我的的时间,尝试一下本身翻译一下英文的 Optimizing graphics rendering in Unity Games,工具
这儿附上英文连接:性能
我的英文水平有限,unity图像学知识也是入门,但愿经过此次翻译能增进本身的图形学知识,如有错误,欢迎各位大神指点,让我也学习进步,谢谢。学习
1、介绍测试
本文主要学习在Unity进行一帧的渲染的时候,观察到的场景背后的运行原理,在渲染的时候会有什么样性能问题发生以及如何解决这些渲染相关的问题。优化
在开始阅读这篇文章以前,首先须要知道对于渲染问题是没有万能的解决之法的。渲染的结果受到游戏中众多因素的影响,同时也极其依赖于游戏所运行的硬件条件和操做系统。最重要的一点,是要记住咱们须要经过分析,实验和测试,严密的分析测试结果来解决渲染性能问题。this
本文主要分析常见的渲染问题并提供相应问题的解决办法及其连接,并不能彻底归纳渲染的问题,因此本文主要旨在提供解决的思路并提供一些较为有效的查找办法的途径。spa
2、渲染的简单介绍操作系统
在开始本文以前,让咱们快速的回顾一下在Unity的一帧渲染中发生的事情。理解下面的一些概念和关系对于解决渲染性能问题有较大的帮助。翻译
注意:在全文中咱们会使用"object"来表明游戏中须要被渲染的物体,任何带有渲染组件的物体均可以被称为object。
从最基本的角度看,渲染过程的组件能够分为:
1)CPU,主要计算出须要被渲染的对象和渲染的方式;
2)GPU,CPU将渲染指令发送给GPU
3)GPU根据CPU的渲染指令进行渲染工做
本文接下来会详细介绍这几步流程,如今只须要熟悉这几个关键词汇并理解其在渲染过程当中所扮演的角色。
渲染管道经常被这生动的用来描述渲染的过程,高效的渲染过程就是保持信息的流动。CPU在每帧的渲染过程当中的工做主要包括:
1)CPU检查场景中的object是否须要被渲染。一个object只有知足必定的条件才能够被渲染,例如它的部分模型处于相机的视角范围内 View frustrum。被剔除的object是不会被渲染的,更多关于相机视角和视角剔除的信息能够点击这里
2)CPU收集须要被渲染的object并将其排序为渲染指令(Draw calls)。一个DC主要包含一个网格的数据和其渲染方式,例如其中哪一个贴图须要被使用。在一般状况下,使用相同的DC的objects会被合并,这种合并不一样渲染objects的操做就是批处理(batching)。
3)CPU对每一个DC中的数据进行批处理打包,有时打包的结果有时更多的包含的是数据而不是DC,可是这对渲染影响不大,因此本文并不考虑这些状况。
对于每一个包含DC的打包指令,CPU必须进行如下处理:
1) CPU发送一个指令改变当前的渲染状态(render state)。这个指令叫作 SetPass call,主要用来告诉GPU下一个被渲染的网格的渲染设置,该指令也只有在下一个渲染网格的渲染设置和当前的设置不一样的时候会被发送。
2)CPU发送DC给GPU,DC指令主要操做GPU采用最近的SetPass Call 设置来对特定的网格进行渲染。
.在一些状况下,在一个batch中会有多个pass(shader中的一部分代码),若是一个pass中要求新的渲染状态(render state),那么CPU就会发送一个新的SetPass指令给GPU,而后从新发送DC指令。
与此同时,GPU须要进行以下操做:
1)GPU根据指令的顺序处理渲染任务。
2)若是当前的任务是SetPass Call,那么更新当前的渲染状态。
3)若是当前任务为DC,GPU就渲染网格。 根据shader代码中的不一样步骤进行渲染。该部分的渲染较为复杂,在此并不作深刻阐述,可是了解shader中的 vertex shader有利于了解GPU是如何处理网格中的顶点数据,了解shader中的 fragment shader有利于了解GPU是如何绘制每一个单独的像素点。
4)这个过程会重复的进行直到CPU中发送过来的渲染指令都被处理完。
在了解了Unity在进行一帧的渲染中的操做后,如今咱们考虑在渲染中的一些问题。
一、渲染问题的分类
对于渲染,有一个关键点是:CPU和GPU必须在渲染的一帧中完成各类的任务,若是任何一个花费较长时间来完成,则会形成一帧的渲染延迟。
渲染的问题主要有两个基本的因素。第一因素是低效的渲染管道,若是在渲染管道过程当中某个或者多个步骤消耗较长时间就会形成渲染管道的低效,从而中断数据流,这也被称为渲染瓶颈。第二个因素是渲染管道中数据过多,即便是最高效的渲染管道在每帧的渲染处理中也有数据量大小的限制。
若是渲染问题来自于CPU在计算渲染任务时耗时过长,则将其称为 CPU bound, 若是渲染问题来自于GPU渲染耗时过长,则将其称为 GPU bound。
二、了解定位渲染问题
在咱们进行任何渲染改进以前,能够利用分析工具来了解定位形成渲染问题的缘由。不一样的问题有不一样的解决办法,同时咱们须要测量咱们的改进结果。解决渲染性能问题是一个平衡的操做,提高一方面的性能会对另外一方面的性能形成相反的效果。
咱们将利用两种unity中的工具来定位渲染性能问题:Profiler window 和 Frame Debugger.
The Profiler window
利用profiler window 咱们能够查看到游戏运行时各个方面的实时数据,包括内存使用,渲染管道和脚本的性能。若是你对profiler window还不是很熟悉,能够点击此处this page of the Unity Manual,使用文档:文档
The Frame Debugger
利用Frame Debugger能够了解每帧的渲染操做及其详细的渲染信息,好比每一个DC中渲染的是什么,每一个DC的shader属性,GPU接收到的渲染指令顺序等。利用渲染信息能够帮助咱们了解到游戏中的渲染状况从而提高游戏的性能。
若是你对Frame Debugger不是很了解,能够点击此处:this page of the Unity Manual ,视频展现点击此处:视频展现
查找形成渲染性能问题的缘由
在咱们尝试改进渲染问题的时候,咱们必须肯定游戏运行较慢的缘由是由渲染问题形成,若是游戏运行较慢来自于游戏脚本运行复杂则优化渲染无济于事,能够经过此处来肯定是否因为渲染形成游戏运行较慢:点击此处
一旦咱们肯定游戏运行较慢来自于渲染,则须要肯定是因为CPU仍是GPU,不一样的问题有不一样的解决办法,因此在解决问题前定位问题很是重要,若是你不肯定渲染问题来自于CPU仍是GPU,能够点击:点击此处
在定位渲染问题来自于CPU仍是GPU后,下面详细介绍各自的解决办法,参看下一篇文章。