最近有一点个人的时间,尝试一下自己翻译一下英文的 Optimizing graphics rendering in Unity Games,

这儿附上英文链接:

  个人英文水平有限,unity图像学知识也是入门,希望通过这次翻译能增进自己的图形学知识,若有错误,欢迎各位大神指点,让我也学习进步,谢谢。

介绍

    本文主要学习在Unity进行一帧的渲染的时候,观察到的场景背后的运行原理,在渲染的时候会有什么样性能问题发生以及如何解决这些渲染相关的问题。

  在开始阅读这篇文章之前,首先需要知道对于渲染问题是没有万能的解决之法的。渲染的结果受到游戏中众多因素的影响,同时也极其依赖于游戏所运行的硬件条件和操作系统。最重要的一点,是要记住我们需要通过分析,实验和测试,严密的分析测试结果来解决渲染性能问题。

  本文主要分析常见的渲染问题并提供相应问题的解决办法及其链接,并不能完全概括渲染的问题,所以本文主要旨在提供解决的思路并提供一些较为有效的查找办法的途径。

渲染的简单介绍

在开始本文之前,让我们快速的回顾一下在Unity的一帧渲染中发生的事情。理解下面的一些概念和关系对于解决渲染性能问题有较大的帮助。

注意:在全文中我们会使用"object"来代表游戏中需要被渲染的物体,任何带有渲染组件的物体都可以被称为object。

  从最基本的角度看,渲染过程的组件可以分为:

. CPU,主要计算出需要被渲染的对象和渲染的方式;

. GPU,CPU将渲染指令发送给GPU

. GPU根据CPU的渲染指令进行渲染工作

  本文接下来会详细介绍这几步流程,现在只需要熟悉这几个关键词汇并理解其在渲染过程中所扮演的角色。

  渲染管道常常被这生动的用来描述渲染的过程,高效的渲染过程就是保持信息的流动。CPU在每帧的渲染过程中的工作主要包括:

. CPU检查场景中的object是否需要被渲染。一个object只有满足一定的条件才可以被渲染,例如它的部分模型处于相机的视角范围内 View frustrum。被剔除的object是不会被渲染的,更多关于相机视角和视角剔除的信息可以点击这里

. CPU收集需要被渲染的object并将其排序为渲染指令(Draw calls)。一个DC主要包含一个网格的数据和其渲染方式,例如其中哪个贴图需要被使用。在通常情况下,使用相同的DC的objects会被合并,这种合并不同渲染objects的操作就是批处理(batching)。

. CPU对每个DC中的数据进行批处理打包,有时打包的结果有时更多的包含的是数据而不是DC,但是这对渲染影响不大,所以本文并不考虑这些情况。

  对于每个包含DC的打包指令,CPU必须进行以下处理:

. CPU发送一个指令改变当前的渲染状态(render state)。这个指令叫做 SetPass call,主要用来告诉GPU下一个被渲染的网格的渲染设置,该指令也只有在下一个渲染网格的渲染设置和当前的设置不同的时候会被发送。

. CPU发送DC给GPU,DC指令主要操作GPU采用最近的SetPass Call 设置来对特定的网格进行渲染。

.在一些情况下,在一个batch中会有多个pass(shader中的一部分代码),如果一个pass中要求新的渲染状态(render state),那么CPU就会发送一个新的SetPass指令给GPU,然后重新发送DC指令。

  与此同时,GPU需要进行如下操作:

. GPU根据指令的顺序处理渲染任务。

. 如果当前的任务是SetPass Call,那么更新当前的渲染状态。

. 如果当前任务为DC,GPU就渲染网格。 根据shader代码中的不同步骤进行渲染。该部分的渲染较为复杂,在此并不做深入阐述,但是了解shader中的 vertex shader有利于了解GPU是如何处理网格中的顶点数据,了解shader中的 fragment shader有利于了解GPU是如何绘制每个单独的像素点。

. 这个过程会重复的进行直到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后,下面详细介绍各自的解决办法,参看下一篇文章。

Unity渲染优化中文翻译(一)——定位渲染问题的更多相关文章

  1. Unity渲染优化中文翻译(二)——CPU的优化策略

    紧接上一篇文章,继续渲染的优化问题,若有错误,请指出,让我也学习进步,谢谢. 如果游戏渲染问题来自CPU 概括的来说,CPU在一帧的渲染中的工作可以分为三个部分: . 决定谁需要被渲染 . 为GPU准 ...

  2. Unity渲染优化中文翻译(三)——GPU的优化策略

    如果游戏的渲染瓶颈来自于GPU 首要任务就是找出造成GPU瓶颈的因素所在,通常GPU的性能受到像素分辨率的影响,特别是在移动客户端的游戏,但是内存带宽和顶点计算的影响也需要注意.这些因素的影响都需要实 ...

  3. 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)

    http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...

  4. Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术

    转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...

  5. Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译

    本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...

  6. Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

    本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  7. Unity性能优化(1)-官方教程The Profiler window翻译

    本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻 ...

  8. 剖析虚幻渲染体系(12)- 移动端专题Part 3(渲染优化)

    目录 12.6 移动端渲染优化 12.6.1 渲染管线优化 12.6.1.1 使用新特性 12.6.1.2 管线优化 12.6.1.3 带宽优化 12.6.2 资源优化 12.6.2.1 纹理优化 1 ...

  9. 【前端优化之渲染优化】大屏android手机动画丢帧的背后

    前言 上周我与阿里的宇果有一次技术的交流,然后对天猫H5站点做了一些浅层次的分析,后面点时间基本天天都会有联系,中途聊了一些技术细节.聊了双方团队在干什么,最后聊到了前端优化.因为我本身参与了几次携程 ...

随机推荐

  1. Warning: Attempt to present on whose view is not in模态跳转问题

    错误分析:            controller A present controller B ,前提是A的view要存在,如果不存在,就会报这个错.   解决方法:             将 ...

  2. object-c中的BOOL类型

    object-c中的布尔类型比C语言中的bool类型早了10年,它具有YES和NO两种值.在object-c中的布尔类型BOOL实际上是一种带符号的字符类型(signed char),它使用的空间是1 ...

  3. XML解析之SAX解析技术案例

    Java代码: package com.xushouwei.xml; import java.io.File; import java.io.IOException; import java.text ...

  4. Angular - - $cacheFactory

    可能之前的api写的有些枯燥吧,因为不烧脑,不需要很多逻辑思维来做处理,那么之后的文章会有趣很多,慢慢的开始烧脑了,准备好大量脑细胞的死亡吧~   先来篇简单的缓存服务. 这里野兽把api文档里的$c ...

  5. 【转】 如何提高自己的acm个人能力

    2011-05-17 21:26 1429人阅读 评论(0) 收藏 举报 算法网络blog八卦游戏读书 转载自 简单de数字 最终编辑 fading_code by   zfy0701 本来以为HNU ...

  6. js blob

    Blob 是什么? 这里说的是一种JavaScript的对象类型. Oracle 中也有类似的栏位类型. 在 [JS进阶] HTML5 之文件操作(file) 这一篇中用到了File对象,而实际上 f ...

  7. 实例:基于ListActivity实现列表

    如果程序的窗口仅仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现,ListActivity的子类无须调用setContentView()方法来显示某个界面,而是可以直 ...

  8. win7配置自己的IIS服务器亲自做的图文很详细

    跟人网站爱好初学者必看的win7系统配置自己的IIS,可以在你自己的电脑上配置网站服务器发不到网上,下面就跟着我的步骤一起做吧100%成功. 步骤/方法     点击开始-------控制面板这个就是 ...

  9. 阿里云服务器windows系统C盘一键清理脚本

    @ECHO OFF @echo @echo @echo 清理几个比较多垃圾文件的地方 DEL /F /S /Q "C:\WINDOWS\PCHealth\ERRORREP\QSIGNOFF\ ...

  10. HDU4734(数位dp)

    F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...