CPU bound:CPU性能边界,是指CPU计算时一直处于占用率很高的状况。
GPU bound:GPU性能边界,一样的是指GPU计算时一直处于占用率很高的状况。
在这篇文章中,咱们将学习Unity渲染一帧时在幕后会发生什么,渲染时会出现什么样的性能问题,以及如何修复与渲染相关的性能问题。
在阅读本文以前,有一点须要记住的是,即没有适合全部状况的方法能够提升渲染性能。渲染性能受到游戏中许多因素的影响,同时也高度依赖于游戏所运行的硬件和操做系统。最重要的是要记住,咱们经过研究、实验和严格分析实验结果来解决性能问题。
这篇文章包含了关于渲染的最多见的性能问题的信息,以及如何修复这些问题的建议和进一步的延伸阅读连接。咱们的游戏可能会有一个或多个问题这里并无提到。然而,这篇文章仍然会帮助咱们理解咱们的问题,并给咱们知识和词汇来有效地寻找解决方案。
在咱们开始以前,让咱们来看看Unity渲染一帧时会发生什么。理解事件流和正确的术语将帮助咱们理解、研究和解决性能问题。
注:在本文中,咱们将使用术语“object”来表示游戏中可能渲染的对象。任何带有Renderer组件的GameObject都会被称为object。
在最基本的层面上,渲染能够描述以下:
如今让咱们仔细看看发生了什么。在本文后面的部分中,咱们将更详细地介绍这些步骤,可是如今让咱们先熟悉所使用的单词,并理解CPU和GPU在渲染过程当中扮演的不一样角色。
描述渲染经常使用的短语是渲染管线,这是一个须要牢记的过程;高效的渲染就是保持数据高效地流动。
对于渲染的每一帧,CPU都作了如下工做:
对于每一个包含一个draw call的批处理,CPU如今必须执行如下操做:
同时,GPU还作了如下工做:
如今咱们已经了解了 Unity渲染一帧时所发生的事情,让咱们考虑一下渲染时可能出现的的问题。
关于渲染最重要的一点是:为了渲染一帧,CPU和GPU都必须完成全部的任务。若是这些任务中的任何一个花费太长时间来完成,它将致使帧的渲染延迟。
渲染的问题有两个基本缘由。第一类问题是由低效的管线引发的。当渲染管线中的一个或多个步骤花费太长时间没法完成时,就会出现低效率的管线,从而中断数据的顺畅流动。管线内的低效被称为瓶颈(bottlenecks)。第二种类型的问题是因为试图经过向管线推送太多的数据而致使的。即便是最有效的管线也有一个限制,即在一帧中能够处理多少数据。
当咱们的游戏是由于CPU花费太多的时间去执行任务而致使须要花费很长的时间渲染一帧时,咱们的游戏就是所谓的CPU边界(CPU bound)。当咱们的游戏由于GPU执行它的渲染任务而花费太多的时间渲染一帧时,咱们的游戏就是所谓的GPU边界(GPU bound)。
在进行任何修改以前,使用Profiler分析工具来了解性能问题的缘由是很是重要的。不一样的问题须要不一样的解决方案。一样重要的是,咱们要衡量咱们所做的每个修改的效果;解决性能问题是一种平衡的行为,改进性能的一个方面可能会对另外一个方面产生负面影响。
咱们将使用两个工具来帮助咱们理解和修复渲染问题:Profiler和Frame Debugger。这两个工具都内置在Unity中。
Profiler窗口容许咱们查看关于游戏执行状况的实时数据。咱们可使用Profiler查看关于游戏的许多方面的数据,包括内存使用、渲染管线和用户脚本的性能。
若是你还不熟悉使用Profiler,那么Unity 是一个很好的介绍, 一篇文章将详细介绍如何使用它。
帧调试器容许咱们一步步地查看帧是如何渲染的。使用帧调试器,咱们能够看到详细的信息,例如每次draw call中绘制的内容、每次draw call的着色器属性以及发送到GPU的事件顺序。这些信息帮助咱们理解游戏是如何渲染的,以及咱们能够在哪里提升性能。
若是你还不熟悉帧调试器的使用,Unity手册中 的部分是一个很是有用的指南。
在咱们尝试提升游戏的渲染性能以前,咱们必须确保游戏是因为渲染问题而运行缓慢的。若是问题的真正缘由是过于复杂的用户脚本,那么尝试优化渲染问题是没有意义的。若是你不肯定你的性能问题是否与渲染有关,请查看这一篇 。
一旦咱们肯定了咱们的问题与渲染有关,咱们还必须了解咱们的游戏是CPU bound,仍是GPU bound。这些不一样的问题须要不一样的答案,因此在尝试解决问题以前,咱们必须了解问题的缘由,这一点很是重要。若是你还不肯定你的游戏是CPU bound仍是GPU bound,你应该查看 教程。
若是咱们肯定咱们的问题与渲染有关,而且咱们知道咱们的游戏是CPU bound仍是GPU bound,咱们就能够继续下面的内容了。
若是咱们的游戏是受到了CPU的限制
通常来讲,CPU渲染一帧所必须完成的工做分为三类:
这几个类包含许多单独的任务,这些任务能够跨多个线程执行。线程容许独立的任务同时发生;当一个线程执行一个任务时,另外一个线程能够执行一个彻底独立的任务。这意味着工做能够作得更快。当渲染任务被分割到不一样的线程时,这称为多线程渲染。
在Unity的渲染过程当中有三种类型的线程:主线程,渲染线程和工做线程。主线程是咱们游戏的大部分CPU任务发生的地方,包含一些渲染任务。渲染线程是一个专门的线程,它向GPU发送命令。每一个工做线程执行单个任务,例如剔除或者网格蒙皮。哪一个线程执行哪些任务取决于游戏的设置和游戏运行的硬件。例如,目标硬件的CPU内核越多,能分配的工做线程就越多。所以,在目标硬件上描述咱们的游戏是很是重要的;咱们的游戏在不一样设备上的表现可能会很是不一样。
由于多线程渲染是复杂的,而且依赖于硬件,因此在咱们尝试提升性能以前,咱们必须了解是哪些任务致使咱们的游戏受到了CPU的限制。若是咱们的游戏运行缓慢是由于在一个线程上的剔除操做花费太多的时间,那么它将没法帮助咱们减小在另外一个线程上向GPU发送命令所花费的时间。
注意:并不是全部平台都支持多线程渲染;在撰写本文时,WebGL不支持这个特性。在不支持多线程渲染的平台上,全部CPU任务都在同一个线程上执行。若是咱们的CPU限制出如今这样的平台上,那么优化任何CPU的工做都将提升CPU性能。若是这是咱们游戏的状况,咱们应该阅读一下全部部分并考虑哪些优化可能最适合咱们的游戏。
在Player Settings中的 选项决定了Unity是否使用工做线程来执行渲染任务,而这些任务在其余状况下是在主线程上完成的。在有此功能的平台上,它能够提供至关大的性能提高。若是咱们但愿使用这个特性,咱们应该在启用和不启用Graphics jobs的状况下对游戏进行概要分析,并观察它对性能的影响。
找出哪些任务致使了性能问题
咱们能够经过使用Profiler来肯定哪些任务致使咱们的游戏受到CPU的限制。本教程展现了如何肯定问题所在。
如今咱们已经了解了哪些任务致使咱们的游戏受到CPU的限制,让咱们来看看一些常见的问题及其解决方案。
向GPU发送命令所花费的时间是游戏受到CPU限制的最多见缘由。这个任务是在大多数平台上的渲染线程上执行的,尽管在某些平台上(例如paystation 4)这多是由工做线程执行的。
向GPU发送命令时发生的代价最大的操做是SetPass call 。若是咱们的游戏因为向GPU发送命令而受到CPU限制,那么减小SetPass call的数量多是提升性能的最佳方法。
SetPass calls的数量及其与批处理数量的关系取决于几个因素,咱们将在本文后面更详细地讨论这些主题。然而,一般状况是:
若是减小批处理的数量并不能减小SetPass call的数量,那么它自己仍然能够提升性能。这是由于CPU处理单个批处理比处理多个批处理更有效率,即便它们包含相同数量的网格数据。
总的来讲,有三种方法能够减小批处理和SetPass call的数量。咱们将更深刻地研究这些问题:
不一样的技术将适用于不一样的游戏,因此咱们应该考虑多有这些选项,决定哪些能够适合应用于咱们的游戏和试验中。
减小必须渲染的对象数量是减小批处理和SetPass call数量的最简单方法。咱们可使用几种技术来减小渲染对象的数量。
实时光照,阴影和反射为游戏添加了大量的真实性,但可能会很是耗费性能。使用这些特性会致使对象被屡次渲染,这会极大地影响性能。
这些特性的确切影响取决于咱们为游戏选择的渲染路径。渲染路径是在绘制场景时执行计算顺序的术语,在不一样的渲染路径之间的主要区别在于它们如何处理实时光照,阴影和反射。通常来讲,若是咱们的游戏运行在高端硬件上,而且使用了大量的实时光照、阴影和反射,那么延迟渲染(Deferred Rendering)多是一个更好的选择。若是咱们的游戏运行在低端硬件上而且不使用这些特性的话,前向渲染(Forward Rendering)可能会更适合。然而,这是一个很是复杂的问题,若是咱们但愿利用实时光照、阴影和高光,最好研究一下这方面的主题和作不一样的试验。Unity手册的 提供了更多关于Unity中可用的不一样渲染路径的信息。这篇 包含了关于Unity中有关灯光为主题的有用信息。
不管渲染路径如何选择,实时灯光、阴影和反射的使用都会影响咱们的游戏性能,所以了解如何优化它们时很是重要的。
当知足某些条件时,批处理能够包含多个对象的数据。要符合批处理条件,对象必须知足:
批处理符合条件的对象能够提升性能,尽管与全部优化技术同样,咱们必须仔细分析以确保批处理的成本不超过性能收益。
对于符合批处理条件的对象,有一些不一样的技术:
对将要绘制的对象进行剔除、收集批处理数据和生成GPU命令均可能致使CPU限制(CPU bound)。这些任务能够在主线程上执行,也能够在单独的工做线程上执行,这取决于游戏的设置和目标硬件。
是用来当咱们的网格变形动画而使用的技术,称为骨骼动画。它最经常使用于动画角色,根据咱们游戏的设置和目标硬件,渲染蒙皮网格的相关任务一般会在主线程或单个工做线程上执行。
渲染蒙皮网格多是一个昂贵的操做。若是咱们能在Profiler中看到渲染蒙皮网格会致使咱们的游戏受到CPU的限制,那么咱们能够尝试作一些事情来提升性能:
理解许多与渲染无关的CPU任务发生在主线程是很重要的。这意味着,若是咱们在主线程上遇到了CPU限制,那么咱们能够经过减小在与渲染无关的任务上花费的CPU时间来提升性能。
例如,咱们的游戏可能在主线程上执行昂贵的渲染操做和昂贵的用户脚本操做,使咱们的CPU达到性能边界。若是咱们在不丢失视觉效果的状况下尽量地优化渲染操做,咱们就有可能下降本身脚本的CPU成本,从而提升性能。
若是咱们的游戏达到了GPU性能边界,首先要作的就是找出是什么致使GPU瓶颈。GPU的性能一般是受到填充率的限制,尤为是在移动设备上,可是内存带宽和顶点处理也会受到影响。让咱们检查一下这些问题,并了解致使这些问题的缘由,并学会诊断以及修复这些问题。
填充率是指GPU每秒能够渲染给屏幕的像素数。若是咱们的游戏受到填充率的限制,这意味着咱们的游戏试图在每一帧中绘制比GPU所能处理的更多的像素。
检查填充率是否致使咱们的游戏被GPU限制是很简单的:
若是填充率是问题的缘由,有一些方法能够帮助咱们解决这个问题:
内存带宽指的是GPU从其专用内存读取和写入数据的速率。若是咱们的游戏受到内存带宽的限制,这一般意味着咱们使用的纹理太大,GPU没法快速处理。
要检查内存带宽是否有问题,咱们能够执行如下操做:
若是内存带宽是咱们的问题,咱们须要在游戏中减小纹理内存的使用。一样,对于每一款游戏最有效的技术也会有所不一样,可是咱们能够经过一些方式来优化咱们的纹理。
顶点处理是指GPU在网格中渲染每一个顶点时所必须作的工做。顶点处理的成本受到两个因素影响:必须渲染的顶点数量和必须在每一个顶点上执行的操做数量。
若是咱们的游戏达到了GPU性能边界,而且咱们已经肯定它不受填充率或内存带宽的限制,那么顶点处理极可能是问题的缘由。若是是这样,尝试减小GPU必须处进行的顶点处理的数量可能会带来性能的提升。
咱们能够考虑几种方法来帮助咱们减小顶点的数量或咱们在每一个顶点上执行的操做的数量:
咱们已经学习了Unity中渲染是如何工做的,在渲染时会出现什么问题,以及如何在游戏中提升渲染性能。利用这些知识和咱们的分析工具,咱们能够修复与渲染相关的性能问题,并构建游戏架构,使它们拥有一个流畅高效的渲染管线。
下面的连接提供了关于本文主题的进一步详细信息:
如题,出现这个问题是我们公司项目在优化阶段将所有打包的资源,如:Prefab 中的一些对象的材质,都使用了最简单的 shader,这些 shader 可能只是一个 unlit 这个 unlit 简单到什么程度呢?可能只是使用到 uv 坐标对 texture 采样,所以顶点数据仅仅使用到: SV_Position (这个是每个 VertexShader 必定需要的数据,所以这个是剔除不了的) Tex...
。。 既然想到计算,为什么不利用GPU呢, GPU才是计算的达人。 说到GPU的处理,我们会想到shader。。 废话不多说。 直接上代码 c#成眠 翻转,镜像等等效果,这里就不多说了。
不管Widget和Panel,我只关心这个类对外开放什么接口,需要什么数据等等,结果发现这种方法效果奇佳。 废话不多说切入正题,DrawCall是NGUI最核心的一个类,它负责把顶点,UV,颜色等数据输入到网格和构建材质,最终绘制出我们看到的UI图形. 通过顶点,UV,颜色,贴图等信息绘制UI图形
,拖拉出一条线到Lerp的输入端,此处混合颜色,就拖RGB输入端,R、G、B的输出只是一个值。两个Color分别连入Lerp的A和B端。 (9-1)按U键,出现U开头的选项集合。
最近,著名的图形引擎Unity已经更新到Unity5.5版本,它带来了一系列与虚拟现实相关的新功能和改进。不仅仅是简单地支持Holographic,Unity编辑器还添加了Holographic模拟器,以便开发者可以直接在编辑器中进行原型设计、调试和迭代设计,游戏开发者可以通过Unity编辑器创建原型,修复BUG和调试软指甲,而不需要将应用程序集成到Hololens中,非常实用!此外,Unity5.5还增加了新的粒子系统、线渲染组件、优化的动画窗口、新的启动页面工具和名为LookDev的实验工具,改进了动画窗口的工作过程,大大提高了性能,迭代更快、更可靠。
PS:本站为大家带来的是Unity 3D 5.5【附安装教程】绿色破解版免费下载,欢迎下载安装使用~
首先,我们不断扩大内容创作者接触新用户和新市场的机会。Unity5.5已经正式支持Microsoftholographic(hololens),现在我们可以开始探索Unity中增强和混合的现实。我们还改进了IAP应用的内部购买功能,使用storefronts需要编写代码,并增加了对cloudMolah商店的支持。
●更好地为设计师使用。
我们努力让设计师在Unity中更方便,并添加了一些更好的工具供设计师使用。在Unity5.5中,粒子系统和线条渲染器组件有了很大的改进。它改进了动画窗口的工作流程,大大提高了性能,迭代更快更可靠。新的启动画面制作工具,只需点击几次即可在游戏启动画面中介绍您的品牌。还引入了名为LookDev的实验工具,简化了基于物理着色的项目的制作过程,保证了不同材料的性能一致。在不久的将来,我们还将推出UnityCollaborate多人合作(开放测试!),让整个团队轻松保存和同步Unity项目。
最后,一些新的功能旨在提高性能,以便开发为所有平台的用户提供最佳体验。例如,为Android和iOS平台增加GPUInstancing支持,增加新的CPUUSageProfiler时间轴视图,更新Physx3.3.3物理引擎。
以下是Unity5.5中新功能的详细介绍!
Unity5.5现在支持Microsoftholographic。直接在Unity编辑器中添加全息模拟功能,以改进开发过程。开发hololens应用程序的开发者将能够直接在Unity编辑器中创建原型、调试和迭代设计,而无需在真实的hololens设备上构建和配置。请参考holographic文档中的详细信息。
我们知道管理多个商店和平台的应用程序内部采购(IAP)是非常痛苦的!因此,我们应该确保开发者能够专注于制作优秀的游戏,而不会错过盈利的机会。
Unity5.5中的粒子系统已经大量更新。
新的Lightsmodule(光模块)可以将实时光附着在一些粒子上,光也可以继承它们附着的粒子的属性。现在粒子效应可以更方便地发射到周围环境中。
colorgradint系统也更加灵活,可以更好地控制粒子颜色。使用该系统选择颜色列表,每种颜色都可以设置自己的权重:
现在定制数据可以传输到粒子着色器,如粒子的大小、旋转和速度。切线也可以传输到着色器中,以实现法线映射。
主粒子设置的所有属性都暴露在脚本中,可以查看更多的控制和自定义选项。我们还增加了将自定义数据传输到粒子系统顶点着色器的功能,可以用来编写自定义着色器。
最后,我们还提高了粒子效应中添加Sub-Emiters的数量限制。现在我们可以根据需要创建尽可能多的Sub-Emiters,它们还将继承父粒子的属性,如颜色、大小、旋转和速度。
3.动画窗口迭代更快。
改进了AnimationWindow(动画窗口)的工作流程,并大大提高了性能进行更快更可靠的迭代。
首先,在AnimationWindow中添加了一个新的Box工具。使用Box工具可以快速、方便地移动。缩放或联动编辑Dopeshet(摄影表)和曲线上的关键帧。
我们还在曲线编辑器中添加了自动收敛(Clamped-Auto)切线模式,以取代当前的自动(Auto)切线模式。当关键帧过于相似时,当前模式将超出曲线值范围。将关键帧设置为Clamped-Auto切线模式后,当关键帧快速越界时,切线会逐渐变平。
同时,底层也有大量的性能提升,这加快了AnimationWindow的渲染速度。查看Demo视频了解更多细节。
Unity5.5在渲染线条和轨迹的方式上有了很大的改进:Linerender(线条渲染器)将在指定的点集之间渲染一条直线,Trailrender(轨迹渲染器)将在移动对象后面渲染一条轨迹,两个组件都使用改进的线条绘制算法进行升级。请比较Unity5.4,看看渲染上的区别:
5.全新启动画面制作工具。
全新的启动画面制作工具可以更方便地在游戏启动时显示您的公司、发行商和游戏标志作为启动画面。此外,还有各种易于配置的选项:标志出现顺序、商标、背景图片和动画等。
LookDev是一种基于HDR(高动态范围)图片的照明工具。您可以通过查看器检查和比较资源,以确保它们在各种照明条件下都能正常工作。
LookDev是专门为艺术设计师制作的工具,适用于纹理、建模、照明设计师、艺术总监、外包经理以及需要资源可视化和验证的视觉艺术风格相关人员。
Unity内置LookDev工具简化了基于物理着色的项目中保证材料性能一致的过程。
LookDev是Unity的新实验功能,请查阅文档了解更多信息。
我们提供了各种光照示例,帮助您使用该工具,创建了一组LatLong分辨率HDR图片,共7张,分别是在世界各地拍摄的照片。您可以在Assetstore上获取这些图片。
所有使用Unity5.5的开发者都应邀加入Collaborate多人合作开放测试,方便团队保存、共享和同步Unity项目。它对团队所有成员都很容易使用。
7.更多的功能和改进。
和往常一样,发布日志的功能和改进列表也很长。在跳转到发布日志之前,请查看以下要点:
·CPUSageProfiler增加了高细节的时间轴视图和原生内存分配分析视图。
·MonoC#编译器已经升级到Mono4.4版本,除了提供更好的性能外,还修复了许多bug。请注意,当只升级C#编译器而不是完整的Mono运行时,我们认为这是改善Unity中的NET体验的一个非常重要的步骤。
·目前,新项目已默认启用WebGL2.0,可以在支持该标准的浏览器中提高渲染和视觉质量,与OpenGLES3.0相当。虽然浏览器支持仍处于实验阶段,但我们相信浏览器供应商很快将支持其在稳定版本中升级标准。
·底层图形改进:深度缓存精度大大提高,特别适用于大型开放式游戏世界。原始代码插件可以访问底层图形APIMesh和Computebuffer数据。添加Graphics.Drawmeshinstanced,用于手动渲染实例对象。实现了Cubemaparay的支持,并将着色器关键词数量从128增加到256。
·改进了Unity的纹理导入器,增加了从压缩文件中导出纹理格式的选项,包括纹理类型和形状。Unity现在支持FP16格式和BC6H压缩。
·我们的物理引擎已经从Physx3.3.1升级为Physx3.3.3,并为物理性能分析器增加了更多的性能指标。更新的物理引擎为所有物理事件带来了更准确的结果。例如,它解决了许多Raycast对特定类型缩放后的碰撞器的检测失败或错误。此外,我们还增加了物理查询是否检测背面三角形的选项。
·默认碰撞检测模式改为新的PCM(连续接触流形)。与旧的分离轴理论(SAT)相比,新方法试图在帧之间产生准确和一致的接触。此外,它并不需要重新计算每帧之间的碰撞。因此,接触缓存只包括实际接触的对象,以便使用更少的CPU时间来计算接触的反馈和穿透力。
·增加了新的2D物理改进、新的碰撞检测选项、新的碰撞器CapsuleColllider2D和新的Rigidbody2D物理组件。
·场景视图新选对象亮点:现在选对象显示轮廓而不是线框。轮廓的颜色可以设置在Unity中,并可以在Gizmos窗口中使用。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。