减少需要处理的顶点数目

1 优化几何体

尽可能减少模型中三角面片的数目,一些对于模型没有影响、或是肉眼非常难察觉到区别的顶点都要尽可能去掉。

移除不必要的硬边以及纹理衔接,避免边界平滑和纹理分离。

2 模型的LOD技术

原理:当一个物体离摄像机很远时,模型上的很多细节是无法被察觉到的。因此,LOD允许当对象逐渐远离摄像机时,减少模型上的面片数量,从而提高性能。

在Unity中,我们可以使用LOD Group组件来为一个物体构建一个 LOD。我们需要为同一个对象准备多个包含不同细节程序的模型,然后把它们赋给LOD Group组件中的不同等级,Unity就会自动判断当前位置上需要使用哪个等级的模型。

3 遮挡剔除技术

我们需要把遮挡剔除和摄像机的视锥体剔除(Frustum Culling) 区分开来。视锥体剔除只会剔除掉那些不在摄像机的视野范围内的对象,但不会判断视野中是否有物体被其他物体挡住。而遮挡剔除会使用一个虚拟的摄像机来遍历场景,从而构建一个潜在可见的对象集合的层级结构。在运行时刻,每个摄像机将会使用这个数据来识别哪些物体是可见的,而哪些被其他物体挡住不可见。使用遮挡剔除技术,不仅可以减少处理的顶点数目,还可以减少overdraw,提高游戏性能。

遮挡剔除https://docs.unity3d.com/Manual/OcclusionCulling.html

减少需要处理的片元数目

这部分优化的重点在于减少overdraw。简单来说,overdraw 指的就是同一个像素被绘制了多次。

1 控制绘制顺序

在Unity中,那些渲染队列数目小于2 500 ( 如“Background”“Geometry"和“AlphaTest")的对象都被认为是不透明(opaque)的物体,这些物体总体上是从前往后绘制的,而使用其他的队列(如“Transparent”“Overlay”等)的物体,则是从后往前绘制的。这意味着,我们可以尽可能地把物体的队列设置为不透明物体的渲染队列,而尽量避免使用半透明队列。

而且,我们还可以充分利用Unity的渲染队列来控制绘制顺序。例如,在第一人称射击游戏中,对于游戏中的主要人物角色来说,他们使用的shader往往比较复杂,但是,由于他们通常会挡住屏幕的很大一部分区域,因此我们可以先绘制它们(使用更小的渲染队列)。而对于一些敌方角色,它们通常会出现在各种掩体后面,因此,我们可以在所有常规的不透明物体后面渲染它们(使用更大的渲染队列)。而对于天空盒子来说,它几乎覆盖了所有的像素,而且我们知道它永远会出现在所有物体的后面,因此,它的队列可以设置为“Geometry+1"。这样,就可以保证不会因为它而造成overdraw。

2 透明物体

我们可以尽量减少窗口中GUI所占的面积。如果实在无能为力,我们可以把GUI的绘制和三维场景的绘制交给不同的摄像机,而其中负责三维场景的摄像机的视角范围尽量不要和GUI的相互重叠。当然,这样会对游戏的美观度产生一定影响,因此,我们可以在代码中对机器的性能进行判断,例如,首先关闭一些耗费性能的功能,如果发现这个机器表现非常良好,再尝试开启一些特效功能。

在移动平台上,透明度测试也会影响游戏性能。虽然透明度测试没有关闭深度测试,但由于它的实现使用了discard或clip操作,而这些操作会导致一些硬件的优化策略失效。

例如,我们之前讲过PowerVR使用的基于瓦片的延迟渲染技术,为了减少overdraw它会在调用片元着色器前就判断哪些瓦片被真正渲染的。但是,由于透明度测试在片元着色器中使用了discard 函数改变了片元是否会被渲染的结果,因此,GPU就无法使用上述的优化策略了。也就是说,只要在执行了所有的片元着色器后,GPU才知道哪些片元会被真正渲染到屏幕上,这样,原先那些可以减少overdraw的优化就都无效了。

这种时候,使用透明度混合的性能往往比使用透明度测试更好。

3 减少实时光照和阴影

对于多个光源的多Pass,由于无法进行批处理会显著提升drawcall。

  1. 使用烘培技术,把光照提前烘焙到一张光照纹理(lightmap) 中,然后在运行时刻只需要根据纹理采样得到光照结果即可。
  2. 另一个模拟光源的方法是使用God Ray。 场景中很多小型光源的效果都是靠这种方法模拟的。它们一般并不是真的光源,很多情况是通过透明纹理模拟得到的。

在移动平台上,一个物体使用的逐像素光源数目应该小于1 (不包括平行光)。如果一 定要使用更多的实时光,可以选择用逐顶点光照来代替。

在游戏《ShadowGun》中,游戏角色看起来使用了非常复杂高级的光照计算,但这实际上是优化后的结果。开发者们把复杂的光照计算存储到一张查找纹理( lookup texture, 也被称为查找表,lookup table, LUT)中。然后在运行时刻,我们只需要使用光源方向、视角方向、法线方向等参数,对LUT采样得到光照结果即可。使用这样的查找纹理,不仅可以让我们使用更出色的光照模型,例如,更加复杂的BRDF模型,还可以利用查找纹理的大小来进一步优化性能,例如,主要角色可以使用更大分辨率的LUT,而一些NPC就使用较小的LUT。

实时阴影同样是一个非常消耗性能的效果。不仅是CPU需要提交更多的draw call, GPU也需要进行更多的处理。因此,我们应该尽量减少实时阴影,例如,使用烘焙把静态物体的阴影信息存储到光照纹理中,而只对场景中的动态物体使用适当的实时阴影。

UnityShader入门精要——Unity中的渲染优化技术(三)相关推荐

  1. UnityShader入门精要——Unity中的渲染优化技术(二)

    减少DrawCall数目 最常见的优化技术--批处理.实现原理为减少渲染每一帧所需的drawcall数目.使用同一个材质的物体可以一起处理. 优点 缺点 动态批处理 切处理都是Unity 自动完成的, ...

  2. 第16章 Unity中的渲染优化技术

    程序优化的第一条准则: 不要优化.程序优化的第二条准则(仅针对专家! 〉: 不要优化. 一一Michael A. Jackson 在进行程序优化的时候,人们经常会引用英国的计算机科学家Michael ...

  3. unity中的渲染优化技术

    1.CPU 过多的drawCall 使用批处理技术来减少drawCall数目 复杂的脚本或者物理模拟 2.GPU 顶点处理 减少顶点数 优化几何体 使用Lod技术 使用遮挡剔除技术 过多的顶点 过多的 ...

  4. Unity性能优化要点分析(二) 渲染优化技术

    本章摘录自UnityShader入门精要的第16章内容. 移动平台的特点 移动平台的GPU架构有很大不同,由于芯片架构的不同,一些游戏往往需要针对不同的芯片发布不同的版本,以便对每种芯片进行更有针对性 ...

  5. oracle cost小 比较慢,Oracle数据库中有关CBO优化的三个问题

    一.如何使用CostBased优化器优化查询操作? Oracle 提供了基于成本(CostBased)和基于规则(RuleBased)两种优化器,简称为CBO和RBO,用于确定查询操作的执行计划.Co ...

  6. 《UnityShader入门精要》总结(1)理论篇

    紫色:大类概念或简短有力的总结 蓝色:细分概念或重要部分 红色:重要的补充注释 第二章:渲染流程与流程分工 渲染的流程分三个阶段: 应用阶段(开发者控制阶段) 由开发者全权进行管理,控制场景内摄像机位 ...

  7. UnityShader入门精要-9

    目录 1. Unity的渲染路径 前向渲染路径 Unity中的前向渲染 延迟渲染 Unity的光源类型 Unity的光照衰减 Unity的阴影 1. Unity的渲染路径 Unity 5.0之前,有3 ...

  8. UnityShader入门精要笔记1——顶点/片元着色器结构与BRDF(基本光照模型)——实现漫反射

    文章目录 BRDF(基本光照模型) 实现漫反射 光线强度的计算 好现在开始写Shader 新建Shader 添加一个Properties语义块 添加SubShader和Pass. 使用CG/HLSL语 ...

  9. UnityShader入门精要——消融效果

    消融效果 原理:噪声纹理+透明度测试 使用噪声纹理采样的结果和某个控制消融程度的阈值比较,如果小于阈值,就使用clip函数把它对应的像素裁剪掉,这些部分就对应了图中被"烧毁"的区域 ...

最新文章

  1. MySQL基础篇:用户和权限管理
  2. POJ 1160 Post Office
  3. atCoder Ants on a Circle(又是蚂蚁问题。。。)
  4. 360视频云Web前端HEVC播放器实践剖析
  5. LeetCode 148. 排序链表(归并排序、快速排序)
  6. xshell安装mysql步骤_xshell怎么搭建mysql
  7. CSliderCtrl(滑块)控件
  8. [c++] 关于STL中list类的Remove方法的编译错误C2678
  9. python调用swmm程序_Python SWMM5包_程序模块 - PyPI - Python中文网
  10. 计算机系统硬件基本组成
  11. 蓝牙的原理,蓝牙耳机怎么连接手机
  12. kernel Damon实现
  13. CS231n课程笔记:神经网络笔记 2
  14. 产业分析:智能巡检机器人行业
  15. U盘系统盘制作与系统安装(详细图解)
  16. 【Python爬虫案例教学】采集某网站壁纸,实现壁纸自由
  17. com.101tec.zkclient使用
  18. js中offsetHeight,offsetWidth,offsetTop,offsetLeft属性的使用
  19. java 图片合成_java 将两张相片合成一张,开发实用类
  20. Windows系统下载SRA数据,使用sratoolkit工具

热门文章

  1. LeetCode刷题之路:1049. 最后一块石头的重量 II
  2. Codeforces C. Andrew and Stones
  3. 1070 结绳 (25 分)
  4. discuz 自定义联盟推广链接案例及百度分享自定义推广链接的方法
  5. 中冠百年|家庭财富如何管理
  6. 在win7安装theano
  7. 5-7课:与二分查找共组双子星座:快速排序
  8. 那些年,我们一起追过的C++
  9. 一个屌丝程序员的青春(二九一)
  10. E4A雪人影视APP源码