如何去除旁边这种与文章与图无关图片的图片

首先让我们来了解几个概念。

潒素(pixel简写px):是数码感光元件上最小的感光单位,也是数字图片上最小的不可再分割的元素我们通常说某某相机2400万像素,就是指用這样的设备拍出来的图片总共能包含2400万个像素

下图,放大其中一小部分直到能看到一个个的小方块。那么这一个个“小方块”就是┅个个“像素”。

像素的大小是没有固定长度值的不同设备上1个像素色块的大小是不一样的。每一个小方块都有一个明确的位置和被分配的色彩数值而这些小方块的颜色和位置决定了该图像所呈现出来的样子。

图片分辨率(image resolution):是指单位面积内的像素数量即像素密度,单位是dpi(dots per inch像素点/英寸)。

(图片总的像素数量越多图片幅面尺寸会越大,但分辨率未必越高;

真正决定图片分辨率的是图片单位媔积里的像素数量,即图片像素密度

图片像素密度越高,图片分辨率越高)

(同一幅照片的某一部分:(左)低像素密度,(右)高潒素密度)

图片尺寸:我们也会见到类似“图片长1920、宽1080”这样的描述然而,数字图片的“长宽”并非物理意义的长度单位而是在图片“横”和“竖”这两个维度上包含的像素个数。比如的图片是由横向1920个像素、纵向1080个像素(合计2,073,600个像素)构成的。

图片宽度、高度(英団):我们也会见到以物理意义上的长度来描述的图片尺寸比如标准的一寸照片长2.5厘米、宽3.5厘米,这个“厘米”是经过换算而来的国內标准和国际标准也不相同。(具体换算方法请看下文)

图片体积(image size):是指图片文件占用的存储空间大小。比如我们通常说1MB的图片,就是指这个图片文件占了储存器1MB的空间

图片质量:这是一个主观量度,一般可以理解为拍摄出来的数字图片与真实的被拍摄对象之间嘚相似程度

BMP(全称Bitmap):是Windows操作系统中的标准图像文件格式,也是最简单的图片格式图片特点:包含的图像信息较丰富,几乎不压缩甴此带来占用磁盘空间大的缺点,现在很少人会在网页上用BMP格式的图片了

JPG/JPEG(joint photographic group):以“联合图像专家组”的英文首字母缩写命名的图片格式。特点:有损压缩压缩比例高,图片文件占用磁盘空间少

有损压缩(lossy compression):是指把一个体积较大的数字图片

无损压缩(lossless compression):不会丢失圖片的任何信息,仅仅是通过减少重复像素而达到压缩体积的目的

(左:无损压缩,右:有损压缩)

基本概念说完了那么这些概念之間到底有着怎样的关系呢?

每个概念后边都有不同的计算机技术作为支撑图片呈现的样子还与屏幕分辨率、压缩方式、图片内容特性有關,比较复杂(有兴趣的朋友可搜索下文的相关文章做深入了解)。

在此可以简单理解为:图片分辨率越高图片越清晰,所包含的总潒素数量越多图片体积越大(及占用空间越多)。

像素高的相机一定比像素低的相机拍出的照片清晰吗

正解:NO。高像素只能代表可以拍更大尺寸的照片单纯的像素高并不意味着像素密度高。另外图片是否清晰与相机的镜头、感光元件及图像处理器的品质有关。

英语不佳尝试翻译如下:

在这篇文章,我们将会学到当Unity渲染一帧图像的时候屏幕后面会发生什么和渲染的时候会遇到什么性能问题以及如何解决渲染相关的性能问题

閱读文章之前,首先要明白改善渲染性能问题没有一种适合所有情况的方法我们游戏的渲染性能问题受很多方面的影响,并且高度依赖運行游戏的硬件和操作系统要记住最有用的一点是,我们通过调查、实验和严格的分析来解决性能问题

这篇文章包含最常见的渲染性能问题,并提供了如何修复它们的建议及进一步阅读的链接也存在这种情况,我们的游戏有一个或多个问题这篇文章是没有提及的这篇文章仍能帮助我们了解我们的问题,并给我们知识和词汇以便可以有效的寻找解决方案。

在此之前让我们简单快速的看一下Unity渲染一幀会发生什么事。理解接下来的事件和正确的术语将对我们理解、研究和努力修复性能问题有帮助

在这篇文章,我们使用“对象”来代表我们游戏中可能被渲染的对象任何游戏物品挂载了Renderer组件的,将会被当做这样一个对象

在最基本层面上,渲染可以被描述成这样:
CPU负責什么是必须绘制的及它必须怎样绘制
GPU根据CPU的指令进行绘制

现在让我们仔细看看到底发生了什么我们会在文章的后面提及更详细的步骤,但现在我们只理解这些用语并且明白CPUGPU在渲染中起什么作用。

经常使用渲染管线来描述渲染这是一个非常有用的概念。高效的渲染僦是保持信息流畅

对于渲染的每一帧,CPU执行了以下的任务:

  1. CPU检测场景中的每个物体决定他们是否要被渲染。一个物体只有满足一定条件才会被渲染比如,包围盒的一部分必须在摄像机的视锥之内被剔除的物体不会被渲染。关于更多的视锥和剔除相关的信息
  2. CPU收集每個即将被渲染的物体信息并把数据按命令分类,这就叫做draw calls一个draw call包含关于单个mesh与该mesh如何被渲染的数据。比如应该使用哪张图片。在某些凊况下物体共享设置可能会被合并成同一个draw call。合并两个不同的物体为同一个draw call被称为批处理
  3. CPU为每一个draw call创建一个数据包被称为批处理。批處理有时会包含draw calls外的数据但是这种情况不太可能造成性能问题,因此我们在文章中不会考虑这种情况

对于每个包含draw call的批处理来说,CPU必須执行以下操作:

  1. CPU可以向GPU发送一条命令来改变许多被统称为渲染状态的变量这条命令被称为SetPass callSetPass call告诉GPU下一个要渲染的网格使用哪个设置呮有下一个渲染的网格需要改变前一个网格渲染状态的时候才会发送SetPass call
  2. 在某种情况下批处理可能有多个pass。pass是shader代码的一部分一个新的pass需偠渲染状态的改变。对于批处理中的每个pass,CPU必须先发一个新的SetPass call然后再发draw call

同时GPU做以下的工作:

  1. GPUCPU发过来的顺序处理任务
  2. 如果当前任务是draw call,GPU就渲染网格。这个任务是分阶段的由shader代码分开定义。这部分渲染比较复杂我们不会详细介绍。但是对于理解一部分叫做顶点着色器的代码告诉GPU如何去处理网格的顶点一部分叫做片段着色器的代码告诉GPU如何去绘制单个的像素很有帮助。
  3. 这个过程会重复直到GPU处理完从CPU发过来的所有任务

现在我们明白了当Unity渲染一帧的时发生了什么,让我们考虑一下渲染时可能会出现的问题

理解渲染问题最重要是:渲染一帧,CPUGPU必须完成它们所有的任务如果它们当中的任何一个任务完成时间太长,将会造成渲染延迟

渲染问题有两个基本的原因:第一种是:低效的管道。当渲染管道中当一个或多个任务完成时间耗时过长会造成管道效率低会中断数据的流程度。管道内的低效率也被称为瓶頸。第二种是向管道推送了太多的数据即使是最高效的管道,单帧处理的数据也会有一个上限

当我们的游戏花费太长时间渲染一帧是洇为CPU花费太长时间执行渲染任务,那我们的游戏是CPU密集当我们的游戏花费太长时间渲染一帧是因为GPU花费太长时间执行渲染任务,那我们嘚游戏是GPU密集

在我们做出调整之前,使用profiling工具去了解造成性能问题的原因是很重要的不同的问题需要不同的解决方案。测量我们每次莋出的修改的效果也是同样重要的修复性能问题是一种平衡的行为,修复一方面的问题可能引起另一些问题

我们将会使用两种工具帮助我们理解和修复渲染性能问题:Profiler工具和Fame Debugger。这两个工具都是Unity自带的

Profiler允许我们看到游戏实时执行的数据。我们可以使用Profiler看到我们游戏的许哆方面的数据包括内存使用、渲染管道和脚本的性能。

如果你对Profiler还不熟悉请看和

帧调试器允许我们看到一帧是如何一步步渲染的。使鼡帧调试器我们可以看到每个draw call绘制了什么,每个draw call的shader属性和发送给GPU的事件顺序等详细信息这些信息帮助我们理解我们的游戏是如何渲染嘚以及我们可以改善那些性能问题。

查找造成性能问题的原因

在我们尝试改善我们游戏的渲染性能问题之前我们必须先确定我们游戏运荇缓慢是渲染问题造成的。如果造成我们问题的原因是过度复杂的脚本尝试优化我们的渲染性能是没有意义的。如果你还不确定你的性能问题是否与渲染相关请看

一旦我们确定我们的问题与渲染相关,我们必须了解我们的游戏是CPU密集还是GPU密集不同的问题需要不同的解決方案,在尝试修复问题之前了解造成问题的原因是非常重要的。如果你还不确定你的游戏是CPU密集还是GPU密集请查看

如果我们确定了我們的问题与渲染相关,并且我们知道我们的游戏是CPU密集或GPU密集我们接着往下读。

从广义上讲CPU渲染一帧必须要完成的工作分成三类:

这些宽泛的类别包含许多单个任务,这些任务可以跨多个线程执行线程允许多个独立的任务同时执行。当一个线程执行一个任务另一个線程可以执行一个完全独立的任务。这就意味着工作可以更快的完成当渲染任务被拆分跨多个独立的线程时,这就是多线程渲染

threads。主線程执行我们游戏的主要任务包括一些渲染任务。渲染线程是一个特殊的线程负责发送命令给GPU。每个worker线程执行一个单独的任务比如裁剪或网格蒙皮。哪一个任务被哪一个线程执行依赖于我们的游戏设置和游戏运行的硬件比如,目标设备的CPU的内核越多产生的 worker线程越哆。因此我们的游戏在目标设备上分析是非常重要的。我们的游戏在不同的设备执行结果会截然不同

因为多线程选渲染是复杂且依赖硬件的,在我们尝试改善性能问题之前我们必须明白哪个任务是造成CPU密集的原因。如果我们游戏运行缓慢是因为裁剪操作在一个线程耗時太长了通过减少另一个发送命令给GPU的线程的耗时是没有什么帮助的。

不是所有的平台都支持多线程渲染在编写这篇文章的时候,WebGL还鈈支持这个特性在一个不支持多线程渲染的平台,所有的CPU任务都在同一个线程执行如果CPU密集的运行在这样的平台,CPU上任何优化都会改善CPU的性能这种情况下,我们应该阅读下面的章节并考虑哪种优化最适合我们的游戏

Settings。它决定Unity是否使用worker线程执行在main线程上或在某些情况丅渲染现线程上的任务在支持该性能的平台上可以提供相当大的性能提升。如果我们希望使用这个特性我们应该观察使用了Graphics

找到是哪個任务引起的问题

我们可以使用Profiler工具确定是哪个任务造成CPU密集。本教程展示了如何确定问题所在

现在我们明白了哪个任务是造成CPU密集的原因,让我们看下几种常见的问题和解决方案

发送命令到GPU的耗时是游戏CPU密集最常见的原因。这个任务在大多数平台上是在render线程执行但昰在某些平台上(比如PlayStation 4)是在worker线程执行的。

发送命令到GPU的时候最消耗的操作是SetPass call。如果我们游戏的CPU密集是由发送命令到GPU造成减少SetPass calls的数量可能昰最好的改善性能的方法。

我们在Unity的渲染分析器中看到当前有多少SetPass callsbatches正在发送在性能不下降的前提下,SetPass calls数量高度依赖目标硬件在不降低性能的情况下,一个高端的PC机比一个手机能发送更多的SetPass calls

SetPass calls的数量以及它与batches数量的关系,取决于几个因素我们稍后在文章进行详细的介紹。通常会有以下几种情况:

  1. 减少batches的数量或使更多的物体共用相同的渲染状态在大多数情况下会减少SetPass calls的数量
  2. 减少SetPass calls的数量,在大多数情况丅会改善CPU的性能

如果减少了batches的数量没有减少SetPass calls的数量,这仍然导致自身性能的改善这是因为CPU处理单个batch比处理几个batches要高效,即使他们的网格数据同样多

大体上有三种减少batchesSetPass calls数量的方法。我们将会更深入的研究每个方法:

  1. 减少每个必须被渲染的物体的渲染次数通常会减少SetPass calls嘚数量
  2. 把必须要渲染的物体合并成更少的batches将会减少batches的数量

不同的技巧适应不同的游戏,所以我们考虑这里所有的选项决定哪些在我们的遊戏和实验中能够发挥作用。

减少被渲染物体的数量是减少batchesSetPass calls数量的最简单的方法这里有几种可以减少渲染物体的方法:

  1. 简单地减少我們场景中课件的物体的数量是一个有效的解决方案。比如说我们在人群中渲染大量的不同的角色,我们可以在场景中简单的放几个角色如果这个场景看起来还不错并且性能也提高了,这比那些复杂技巧来说是一个更快的解决方案
  2. 我们可以使用摄像机的属性去减少摄像機的绘制距离。超过这个属性的距离的物体不再被摄像机渲染如果我们希望掩盖远处不再渲染的物体这个事实,我们可以尝试
  3. 基于距離的更细粒度的隐藏物体的方法,我们可以使用摄像机的属性为每个单独的层提供自定义的裁剪距离如果我们游戏有很多的装饰小物件,我们可以使用比大地图更短的裁剪距离去隐藏这些小物件这是非常有用的。
  4. 我们可以使用一个叫occlusion culling(遮挡剔除)的方法去隐藏那些被遮挡的粅体比如,我们的场景中有一个大的建筑物使用occlusion culling可以关掉被挡住的物体的渲染。Unity的occlusion culling并不适用于所有尝尽可能会导致CPU消耗过大,并且設置可能会复杂但是在一些场景上可以极大的改善性能问题。针对这一主题进行描述除了使用Unity的occlusion culling之外,我们也可以使用自己的方式去掱动隐藏我们知道不会展示给玩家的物体比如,我们场景中包含一些切场景前或切场景后不可见的物体我们应该隐藏它们。使用我们遊戏的知识总是比要求Unity动态解决问题更有效

减少每个物体被渲染的次数

实时灯光、阴影和反射为游戏增加了很多真实性,但是这非常耗性能使用这些特性可以导致物体被渲染多次,这会大大的影响性能

这些特性的确切的影响取决于我们为游戏选择的渲染路径(rendering path)。渲染路径是绘制场景时计算的顺序的术语渲染路径的主要差别在于它们如何处理实时灯光、阴影和反射。一般来说如果我们的游戏运行茬高端硬件上,并且使用了一些实时灯光、阴影、反射那么延迟渲染(Deferred Rendering)可能是一个更好的选择。如果我们的游戏运行在低端设备上并且沒有使用这些特性,那么正向渲染(Forward Rendering)可能更合适这是一个非常复杂的问题,如果我们希望使用好实时灯光、阴影、反射最好是研究这个主题并实验。介绍了不同的渲染路径的信息包含了一些有用的Unity灯光的主题信息。

不管选择什么渲染路径使用实时灯光、阴影和反射会影响我们游戏的性能,明白如何优化它们是很重要的

  1. Unity的动态灯光(Dynamic lighting)是一个非常复杂的主题,深入的讨论这个主题超出了本文的范围是对這一个主题有极好的介绍。包含了常见的灯管优化细节
  2. 动态灯光非常昂贵。当我们场景包含不移动的物体时我们可以使用一个叫做烘焙(baking)的技术,预先计算场景的灯光这样运行的时候就不需要计算灯光了。介绍了这个技术提及烘焙灯光的细节。
  3. 如果我们希望在游戏中使用实时阴影这可能是我们可以改善性能的地方。展示了如何调整阴影属性(Quality Settings)和它如何影响性能比如,我们可以使用阴影距离(Shadow Distance)属性確保只有靠近的物体才会产生阴影
  4. (Reflection probes)创建了真实的反射,但是批量使用的话消耗会比较大。最好少使用反射尽可能优化使用的地方,性能不容忽视展示如何优化反射探头。

合并物体到更少的批处理

当条件满足的情况下一个批处理包含的数据可以为多个物体使用。批處理要满足以下条件:

  1. 共享相同材质的相同实例
  2. 拥有唯一的材质设置(如图片shader,shader参数等)
    批处理可以改善性能尽管和其他所有优化技巧一样,我们必须细心的分析确保批处理的消耗不会超过性能的获取
    以下有几个不同的技巧:
  • 静态批处理(Static batching)是一个允许Unity对周边的满足批处悝条件的静止不动的物体进行批处理的技术。可以从静态批处理受益的物体一个很好的例子就是一堆相似的物体,比如石头介绍了静態批处理的设置方法。
  • 动态批处理(Dynamic batching)是另一个允许Unity对满足批处理条件的物体进行批处理的方法不管这些物体是静止还是移动。这种方法对粅体是有一定限制的罗列了限制条件。动态批处理对CPU性能有一定影响可能会造成消耗的CPU比节省的要多。在使用这一技术时我们应该牢记这一代价,谨慎使用
  • 批处理Unity的UI元素稍微复杂一些,因为它会受到UI布局的影响进行了概括。提供了如何确保UI批处理按我们希望的方式运行的深度信息
  • GPU实例(GPU instancing)是一种对大量相同物体进行高效批处理的方法。这种方法有一定的限制并且不是所有设备都支持,但如果我们嘚游戏屏幕会同时出现许多相同的物体使用这个方法将会受益良多。包含了对GPU实例的介绍和如何使用的信息以及平台支持情况与能改善遊戏的情况
  • 纹理图集(Texture atlasing)是把多张图片合并到一张更大的图片的方法。通常在2D游戏和UI系统上使用但也同样适用于3D游戏。如果我们使用这个技术的时候我们可以确保物体共享纹理,因此可以进行批处理Unity自带图集的工具,叫做,用于2D游戏
  • 可以通过Unity Editor或者通过代码手动合并共享材质与纹理的网格。使用这种方式进行合并的时候我们要意识到阴影、灯光和裁切都是按per-object级别运行的。这意味着合并网格的增加的性能鈳以和那些不再被裁切的物体的性能相抵消如果我们希望研究这个方法,我们应该测试这个函数例子找到。

裁切收集将要绘制的物體的数据,将这些数据排序成batches并生成GPU命令这些操作都可能会导致CPU密集。
这些任务会在main thread线程执行或单个wroker线程执行这取决于我们的游戏设置和目标设备。

  1. 裁切本身不太消耗性能但减少不必要的裁切可能会改善性能。场景中的物体都有每物体每相机(per-object-per-camera)的开销即使在那些不显礻的层(layers)。为了减少这些消耗我们应该禁用当前不使用的摄像机或隐藏当前不渲染的物体。
  2. 批处理可以很大的提高发送命令给GPU的速度但茬有时候在某些地方可能会增加不必要的性能开销。如果批处理操作是造成我们游戏CPU密集的原因我们可以在游戏中限制手动或自动批处悝的操作。

当我们使用一个叫网格动画的技术来变形网格的时候就会被用到。通常使用在角色动作上渲染蒙皮网格的相关任务一般在main thread戓单独个worker threads上执行,这取决于我们游戏的设置和目标设备

渲染蒙皮网格可能是一个很消耗性能的操作。如果我们在Profiler窗口发现渲染蒙皮网格昰造成CPU密集的原因那我们可以通过一下几个方法来改善性能:

  1. 我们应该考虑当前使用的物体,是否每一个都要使用SkinnedMeshRenderer件有可能我们导入嘚模型实际不会播放动画却使用了SkinnedMeshRenderer组件。像这种情况使用MeshRenderer组件代替SkinnedMeshRenderer组件有助于提升性能。当导入模型的时候我们在模型导入设置中)选擇不导入动画,那么这个模型会有MeshRenderer组件而不是SkinnedMeshRenderer组件
  2. 如果我们只是在某些时候(比如在开始的时候或在摄像机一定距离内)播放动画,我们可鉯切换网格到精简版(a less detailed
  3. 包含了优化蒙皮网格动画的建议包含了SkinnedMeshRenderer组件对改善性能的调整。除了建议之外牢记顶点数越多,网格蒙皮消耗越夶因此使用更少顶点的模型以减少必须完成的工作量。
  4. 在某些平台上蒙皮可能是在GPU处理的而不是在CPU。如果我们的GPU有很多内存的话这個选项是值得尝试的。我们可以在为当前平台启用GPU skinning和质量指标

与渲染与图无关图片的主线程操作

很多跟渲染与图无关图片的CPU任务会发生茬主线程,明白这一点很重要这意味着,如果我们主线程是CPU密集我们减少CPU在非渲染任务上的耗时可能可以改善性能。

比如我们游戏主线程在某些时候执行耗时的渲染操作和运行耗时的用户脚本造成了CPU密集。如果我们已经在尽可能不失真的情况下优化渲染操作我们可能要减少用户脚本的消耗以改善性能。

如果我们的游戏是GPU密集

如果我们的游戏是GPU密集首先要找出造成GPU瓶颈的原因。GPU性能问题通常由(fill rate) 受限淛引起的特别是手机设备上,但(memory bandwidth)和顶点处理也同样需要关注让我们检查一些这些问题并了解是什么原因造成的、分析并修复这些问题。

填充率指是GPU每秒在屏幕上渲染的像素数量如果我们游戏是填充率受限制,这意味着我们游戏尝试绘制的像素超过GPU每帧能处理的像素
佷容易检测我们游戏GPU密集是否是由填充率造成的:

  1. 使用Profiler工具,并注意查看GPU时间
  2. 再次使用Profiler工具如果性能有所改善,那填充率很可能是造成問题的原因

如果填充率是造成问题的原因下面有几个方面可能能帮助我们修复问题。

  1. 片段着色器是shader代码的一部分它告诉GPU如何绘制单个潒素。GPU为每个必须绘制的像素执行这段代码如果代码效率不高,性能问题很容易累积起来复杂的片段着色器很经常造成填充率问题。
  • 洳果我们游戏使用内置的shaders我们应该尽可能使用最简单的,最优化的shaders达到我们想要的视觉效果比如,是高度优化过的shader我们可以使用它們来测试,在不影响游戏视觉的情况下能否改善性能这些shader为手机平台设计,但适用于任何项目在非手机平台上使用"mobile"shaders来提高性能,如果視觉保真能够达到要求那真是非常好的。
  • 如果我们的游戏物体使用了Unity的,Unity会根据当前材质的设置来编译shader只有正在使用的特性会被编译。這意味着移除一些特性如detail maps,可以减少片段着色器的复杂度大大的提升性能。如果我们游戏是这种情况我们可以尝试修改设置,看看能否在不影响视觉质量的情况下改善性能
  • 如果我们的项目使用了自定义的shader,我们应该尽可能的优化它们。优化shader是一个比较复杂的主题包含 了优化shader的有用的信息。
  1. 过度绘制(Overdraw)是同一像素绘制多次的术语当物体被绘制到其他物体顶部的时候会发生Overdraw,并且可能引起填充率问题。为叻弄明白Overdraw,我们必须了解Unity在场景绘制物体的顺序一个物体的shader通常使用决定了绘制顺序(draw order)。Unity使用这些信息来严格的绘制物体有更详细的细节。此外不同的渲染队列在绘制之前进行了不同的排序。比如Unity在Geometry队列中使用front-to-back的排序方式来减少overdraw,但在Transparent队列则使用back-to-front的排序方式来达到所需要嘚视觉效果。实际上在Transparent队列back-to-front的这种排序对overdraw有最大的影响Overdraw是一个复杂的主题,找不到一种可以解决所有overdraw问题的方法但是减少Unity不能自动排序的重叠物体是很关键的。开始调查这个问题的最好地方实在Unity的场景视图那里有个(Draw Model),从那里我们可以看到场景overdraw,我们便知道从哪里入手减尐overdraw最常见的过度overdraw罪魁祸首是透明材质、没有优化过的粒子特效、覆盖的UI元素,所以我们应该尝试优化或减少它们主要关注Unity UI,也包含对overdraw嘚一些引导
  2. 的使用对填充率问题有一定的影响,特别是当我们使用不止一个图片特效如果我么游戏使用了图片特效,并且被填充率问題困扰的时候我们尝试使用不同的设置或更加优化的图片特效(比如Bloom(optimized)代替)。如果我们游戏在同一个摄像机使用了超过一个图片特效会造荿多个shader pass。这种情况下将我们的图片特效shader代码合并成一个pass可能会有益处,这里有个如果我们优化过图片特性后仍然有填充率问题,我们鈳能需要考虑禁用图片特效特别是在低端设备上。

内存带宽是指GPU在专用存储器的读写速率如果我们游戏被内存带宽限制,通常意味着峩们使用的纹理太大以至于GPU无法快速处理

检测游戏是否存在带宽问题,我们需要以下几个步骤:
3.再次使用Profiler工具查看GPU时间如果性能有所妀善,那内存带宽很可能是造成问题的原因

如果我们的游戏存在内存带宽问题我们需要减少游戏中图片(Texture)内存的使用。我们可以通过下面幾个方法优化我们的纹理:
compression)可以极大的减少纹理在硬盘和内存的大小如果内存带宽是我们游戏中问题,使用图片压缩可以减少图片内存夶小来提升性能Unity有很多不同的图片压缩格式和设置,每张图片都可以单独设置一般来说,应该尽可能的使用某种形式的图片压缩反複实验为每张图片找到最好的压缩格式。包含了不同的压缩格式与设置的有用信息
2.Mipmaps是图片的低分辨率版本,可以用在远处的物体上如果场景中有距离摄像机很远的物体,可以使用mipmaps来缓解内存带宽问题场景视图中的可以看到那些地方受益于mipmaps,包含了关于图片开启mipmaps的信息

顶点处理是指GPU必须在网格中渲染每个顶点的工作。顶点处理的消耗受两个地方的影响:必须渲染的顶点数量和每个顶点必须执行的操作數量

如果我们的游戏确定是GPU密集,并且不是填充率造成的也不是内存带宽造成的,那么可能是顶点处理造成的如果是这种情况,尝試减少GPU必须处理的顶点处理数量可能会获得性能的提升。

我们可以考虑几种可以帮助我们减少顶点数量或减少我们执行每个顶点的操作數量

  1. 首先,我们应该致力于减少任何不必要的复杂网格如果我们使用了在游戏中看不到细节的网格或由于创建错误导致顶点过多的低效网格,这是很浪费GPU资源的减少顶点处理消耗的最简单方法是在3D美术工程中创建更少顶点数的网格。
  2. 我们可以尝试使用一种叫做normal mapping(法线贴圖)的方法在创建更大的几何复杂度网格时候可以使用到。尽管有些GPU开销比较大但在多数情况下会带来性能的提升。是在网格中使用法線贴图模拟复杂几何的有用指南
  3. 如果游戏中的网格没有使用法线贴图,我们通常可以在把vertex tangents(顶点切线)禁用这会减少为每个顶点发送给GPU的數据数量。
    4.(细节层级)也被称为LOD,是一个优化技术远离摄像机的网格会降低复杂度。这减少了GPU必须渲染的顶点数量而不影响游戏的视觉质量。包含了如何设置LOD的更多信息
  4. Vertex shaders(顶点着色器)是shader代码的一段,告诉GPU如何渲染每个顶点如果我们的游戏受限于顶点处理,减少我们的顶点著色器的复杂度可能会有帮助
  • 如果我们游戏使用了自带的shaders,我们应该尽可能使用最简单最优化的shaders来达到我们想要的效果。比如是高度优囮过的shader。我们可以使用它们来测试在不影响游戏视觉的情况下能否改善性能。
  • 如果我们的项目使用了自定义的shader,我们应该尽可能的优化它們优化shader是一个比较复杂的主题,包含 了优化shader的有用的信息

我们已经学习了Unity的渲染工作,渲染时会出现什么问题以及如何改善我们游戏嘚渲染性能使用这些知识和分析关系,我们可以修复渲染相关的性能问题来使我们的游戏有一个更加平滑高效的渲染管线

如图表示物质跨膜运输的一种方式据图分析正确的是


A.这种转运方式可逆浓度梯度进行
B.乙醇分子是以这种方式进入红细胞的
C.图示的物质运输过程与细胞膜的流动性與图无关图片
D.载体蛋白在物质转运过程中形状会发生改变
0

关于细胞的物质转运,下列叙述中不正确的是

A.神经细胞K外流的方式为主动運输
B.植物细胞失水将导致细胞内渗透压升高
C.海水中的海藻细胞可通过积累溶质防止细胞过度脱水
D.RNA聚合酶可通过核孔进入细胞核

难度系数:0.65使用:10次题型:单选题更新:

下列关于膜蛋白的叙述正确的是

A.部分细胞的膜蛋白具有催化作用 B.被动运输过程不需要膜蛋白的參与
C.能量转换过程与膜蛋白与图无关图片 D.细胞间的信息交流必需依赖于膜蛋白

难度系数:0.65使用:10次题型:单选题更新:

蛋白质的结构哆种多样,在细胞中承担的功能也是多种多样的以下过程与蛋白质功能

A.淀粉在淀粉酶的作用下水解

难度系数:0.65使用:11次题型:单选题哽新:

我要回帖

更多关于 与图无关图片 的文章

 

随机推荐