unity GPU优化(Occlusion Culling遮挡剔除,LOD多细节层次,GI(Global Illumination)全局光照)

渲染管线:

定义:图形数据在CPU上经过运算处理,最后输出到屏幕的过程 

1. 顶点处理:接收模型顶点数据、坐标系转换

2. 图元装配:组装面、连接相邻的顶点,绘制为三角面

3. 光栅化:计算三角面上的像素,并为后面着色阶段提供合理的插值参数(以及深度值)

4. 像素处理:对每个像素区域进行着色、写入到缓存中

5. 缓存:一个存储像素数据的内存块,最重要的缓存是帧缓存与深度缓存

• 帧缓存:存储每个像素的色彩(缓冲)

• 深度缓存 Z—buffer:前后排序(深度信息,物体到摄像机的距离)

Draw Call绘制调用:每帧调用显卡渲染物体的次数 

一.Occlusion Culling遮挡剔除:

定义:当物体被送进渲染流水线之前,

将视锥以内看不到的物体进行剔除,减少每帧的渲染量,提高渲染性能 

例一:unity自带的Occlusion Culling(用碰撞实现的)很消耗GUP

步骤:

1.在Window中找到并点击Occlusion Culling

2.把需要进行渲染剔除的物体勾选为Static

3.在右边的Occlusion中选中Object->Occlusion Areas点击Create new Occlusion Areas

4.在Object中点击Bake,和在Bake中点击Bake

5.点击Visuslization和移动相机就可以查看效果了

效果展示:(相机没有看到的物体自动把MeshRander隐藏了)

实例二:用InstantOC(使用射线)检测物体

步骤

下载:AssetStore中下载InstantOC_Dynamic_Occlusion_Culling__LOD_v2.0.0.unitypackage插件

百度云链接:链接:http://pan.baidu.com/s/1jHPrAfG  密码:v0yr

1.创建层

2.为游戏物体指定层(将参与遮挡剔除)与标签(将自动附加 IOClod脚本)

3.物体添加碰撞器Collider组件(通过射线去检测物体)

4.摄像机附加脚本IOCcam

属性

确保剔除物体显示正常的阴影。Layer mask:参与遮挡剔除的游戏对象层。

IOC Tag:将为指定标签的游戏对象自动添加IOClod脚本对象。

Samples:每帧摄像机发射的射线数目。数量多剔除效果 好,但性能开销大。通常在150—500之间。

Rays FOV:射线视野,应大于摄像机视野Field of View。

View Distance:视图距离,射线长度。将影响摄像机Clipping Planes –Far 数值。

Hide Delay:延迟隐藏,当物体被剔除时延迟的帧数,建 议50—100之间。

•PreCullCheck:检查采集信息,建议勾选,可以提高剔除 效率。

•RealtimeShadows:实时阴影,如果场景需要实时阴影, 建议启用,

注意:(物体需要添加Box Collider组件) 

缺点:需要消耗额外CUP 

适用:存在大量被遮挡的物体时使用 

BUG:Realtime Shadows——使用会显示材质丢失

优点:减少渲染压力,优化GPU显示

效果图:

标记的物体没有被遮挡时

标记的物体被遮挡了

二.LOD多细节层次:

定义:根据物体模型的节点在显示环境中所处的位置 和重要度,决定物体渲染的资源分配,降低非重要物体的面数 和细节度,从而获得高效率的渲染运算。(降低非重要物体(远距离物体)的顶点数 (近精模 远简模))

步骤

1.创建层

2.创建空物体并将模型添加到其中,命名为:Lod_0  Lod_1 Lod_2

3.为父物体指定层与标签

4.父物体或子物体添加碰撞器组件

5.摄像机附加脚本IOCcam

属性

Lod1 distance:摄像机到物体距离小于当前距离时,使 用Lod_0模型。

Lod2 distance:摄像机到物体距离大于Lod1且小于当前 距离时,使用Lod_1模型,大于当前值使用Lod_2模型。

LodMargin:LOD边缘,如果物体在LOD各阶段过渡时发 生闪烁,尝试提高当前值。

缺点:消耗CPU判断距离、占用内存、需要三个模型(付费的不需要三个) 

适用:高面模型比较多、有远近变化 

性能优化: 

CPU、渲染、内存 

实例:

三.GI(Global Illumination)全局光照:

•简称GI,即全局光照。

•能够计算直接光、间接光、环境光以及反射光的光照系统。

•通过GI算法可以使渲染出来的光照效果更为真实丰富。

直接光照

定义:从光源直接发出的光,通过Light组件实现。

Type 类型:灯光对象的当前类型

--DirectionalLight 平行光:平行发射光线,可以照射场 景里所有物体,用于模拟太阳。

--PointLight 点光源:在灯光位置上向四周发射光线,可 以照射其范围内的所有对象,用于模拟灯泡。

--SpotLight 聚光灯:在灯光位置上向圆锥区域内发射光 线,只有在这个区域内的物体才会受到光线照射,用于模拟探照灯。

--Area Light区域光:由一个面向一个方向发射光线,只照射该区域内物体,仅烘焙时有效,用在光线较为集中的区域。(仅烘焙用,极耗性能)

Range 范围:光从物体的中心发射的范围。仅适用于点光源和聚光灯。

Spot Angle 聚光角度:灯光的聚光角度。只适用于聚光灯。

Color 颜色:光线的颜色。

Intensity强度:光线的明亮程度。

Culling Mask 选择遮蔽层: 选择要照射的层Layer。

练习:为场景添加光源 

阴影(直接光照)

•Shadow Type 阴影类型:Hard 硬阴影、Soft 软阴影(软阴影较硬阴影更消耗性能 )

--Strength 硬度:阴影的黑暗程度。

--Resolution分辨率:设置阴影的细节程度。

--Bias 偏移:物体与阴影的偏移。

•GameObject通过Mesh Renderer 组件启用/禁用阴影

--Cast / Receive Shadows 当前物体是否投射/接收阴影。

--Off 不投射阴影,On 投射阴影,Two Sided 双面阴影,

Shadows Only 隐藏物体只投射阴影

•阴影剔除:设置显示阴影的距离

Edit->Project Settings->Quality->Shadows Disdance

Tips:光可以设置阴影、物体可以选择是否渲染阴影、阴影剔除可以选择渲染的距离

间接光照

定义:物体表面在接受光照后反射出来的光。

•通过Light 组件中Bounce Intensity 反弹强度控制。

•可以通过Scene 面板Irradiance 模式查看间接光照。

Tips:只有标记LightmapingStatic 的物体才能产生间接反弹光照。(要把物体设置为Static——静态——才能使用间接光)

最不好实现,需要消耗大量性能计算(预计算)

环境光照

定义:作用于场景内所有物体的光照

通过Environment Lighting 中Ambient 控制。

来源:天空盒、梯度颜色、颜色 

•Ambient Source 环境光源

--Skybox 通过天空盒颜色设置环境光照

--Gradient 梯度颜色

Sky 天空颜色、Equator 地平线颜色、Ground 地面颜色

--Ambient Color 纯色

•Ambient Intensity 环境光强度

•Ambient GI  环境光GI模式

--Realtime实时更新,环境光源会改变选择此项。

--Backed 烘焙,环境光源不会改变选择此项。

反射光照

定义:根据天空盒或立方体贴图计算的作用于所有物体的反射效果

通过Environment Lighting 中Reflection 控制。

•Reflection Source 反射源

--Skybox 天空盒

Resolution 分辨率Compression 是否压缩

--Custom 自定义

Cubemap立方体贴图

•Reflection Intensity 反射强度

•Reflection Bounces 使用Reflection Probe 后允许不同游戏对象间来回反弹的次数。

烘焙GI:

烘焙:Lightmap

原定义:当场景包含大量物体时,实时光照和阴影对游戏性能有很大影响。使用烘焙技术,可以将光线效果预渲染成贴图再 作用到物体上模拟光影,从而提高性能。适用于在性能较 低的设备上运行的程序。

简述:将光线效果预渲染成贴图再作用到物体上模拟光影,从而提高性能,适合在性能较低的设备上使用

Tips:手游一般用烘焙GI)

烘焙后的贴图保存在Unity同目录下 

步骤

1. 游戏对象设置为LightmapingStatic。

2. 设置Light组件Baking属性。

3. 启用Lighting 面板的Baked GI。

4. 点击Build按钮。(如果勾选Auto 编辑器会自动检测场 景的改动修复光照效果)

例:

根据上面的步骤:

游戏对象(Cube/Sphere)设置为LightmapingStatic。

创建两个SpotLight聚光灯光源

一个光源的Mode设置为Baked之后在Window Lighting-->Settings中设置

移动该光源下的Sphere可以知道 该Sphere的阴影固定在了Plane上,这是因为Baked仅烘焙时起作用,之后就是一张Texture3D贴图(你可以把该光源删除,理解更容易)

另一个光源的Mode改为Mixed测试

移动下面的Sphere查看其特性

•Light 组件Baking 属性:烘焙模式

--Realtime仅实时光照时起作用。

--Baked仅烘焙时起作用。

--Mixed 混合,烘焙与实时光照都起作用。

•可以通过Scene 面板Baked 模式查看光照贴图。

Baked GI

•Baked Resolution:烘焙光照贴图分辨率,建议比实时GI 分辨率高10倍。

•Baked Padding:光照贴图中各形状间距,取值2到200。

•Compressed:是否压缩光照贴图,压缩则提高性能,缩小容量,但画质会降低。

•Ambient Occlusion:环境遮挡表面的相对亮度,值越高 遮挡处和完全曝光处区别越大,建议为1。

•Final Gather:选中后提高烘焙质量,但会消耗更多时间。

•Atlas Size:光照贴图尺寸。

General GI

•常规GI设置,同时适用于实时GI与烘焙GI。

•Directional Mode 定向模式:

--Non– Directional 无定向模式,使用1种光照贴图存储 光照信息。

--Directional 定向模式,使用2种光照贴图存储光照信息, 相比之下效果更好,但空间占用更大。

--Direction Specular 定向反射模式,使用4种光照贴图存 储光照信息,效果最好,但占用空间最大。

•除无定向模式外必须运行在GLES2.0与SM2.0以上的设备。

GLES 指OpenGL ES 针对移动端,从iPhone5s 开始支持;

SM 指ShaderModel 针对PC 端,目前大部分显卡支持。

•Indirect Intensity 最终间接光照、反射光照的强度。1为默 认强度,小于1则减低强度,大于1则增大强度。

•Bounce Boost 增强间接光照。

•Default Parameters 高级GI参数。

--Default 默认

--Default –HighResolution高分辨率

--Default –LowResolution低分辨率

--Default –VeryLowResolution非常低的分辨率

烘焙后会产生LightingData(灯光信息,匹配图片)

光照贴图


批处理

1、DrawCall(绘制调用Draw Call):每次引擎准备数据(顶点信息,不是面数信息)并通知GPU的过程。通俗讲,每帧调用显卡渲染物体的次数。CPU每帧调用图形学接口,由图形学接口通知GPU做图形渲染的过程。DrawCall变多,CPU每帧调用的次数变多,帧率(FPS每秒帧数)变少,卡顿现象的。决定一个DrawCall的是资源,一个图片资源放到多个场景物体中不会增加DrawCall。

2、DrawCall位置:游戏运行时看Statics:, 为优化的DrawCall数。Profiler面板中的Total Batches的数据才是准确的DrawCall数。

3、DrawCall的优化(又称为批处理),分为两种:静态(Batching)批处理、动态(Dynamic)批处理。动态批处理:可以将符合批处理原则的模型合并,合并后这些模型的DrawCall为一个。 Batched DrawCalls参与动态批处理的物体数量(合并的DrawCall数量),Bacthes降低DrawCall的两种方式:精灵打包、图集。【注意:贴图不影响DrawCall,一个模型更换贴图DrawCall不变,材质才影响DrawCall,给一个Cube加多维子材质,每个面有一个Standard材质,则场景中因为Cube存在增加6个DrawCall】

3.1动态批处理的条件:并不是所有的模型都可以参与动态批处理,不是所有的模型都符合动态批处理条件。满足动态批处理的条件:

①场景中存在摄像机;

②模型的顶点数在300个顶点以内。

③与材质的Shader有关,如果材质的Shader是单通道,则可以参与动态批处理,如果是多通道,则不参与动态批处理。(一个Pass占用一个DrawCall,至少要开启一个通道才能将模型渲染出来,最基础的是漫反射通道(Base Map占用),如果给模型添加了反射、折射、透明、高光等贴图,则Shader中开启对应通道,则不能开启动态批处理,与模型中材质的个数无关,与每个材质中是否有多通道有关);

④Transform组件中的Scale会影响批处理,Rotate、Position不会影响批处理。模型的缩放在不同的Unity版本中会有影响,如果模型的缩放倍数不是很大的话可以参与批处理,倍数过大可能就不能参与批处理。

⑤如果一个模型标记为静态,无论什么类型的静态,则不能参与动态批处理;

⑥只有用Mesh Renderer渲染显示的模型才能参与动态批处理,Skinned Mesh Renderer渲染显示的模型不能参与动态批处理。

⑦Unity中提供的模型与3Ds Max中的模型不能一同参与动态批处理,即使使用同样的材质。所以项目中不要用Unity自带的模型。只要用同一个材质,即使网格不相同,只要顶点数少于300,也能一同参与动态批处理。

3.2、静态批处理满足的条件:

①模型必须是静态的才可以参与批处理。

②顶点数无要求。

③对通道无要求,多通道也可以参与静态批处理;

④参与灯光烘焙的模型(标记为静态)也可以用静态批处理;

⑤网格渲染组件也必须是Mesh Renderer;

⑥Transform组件也不影响静态批处理(缩放范围别过大即可)。

3.3、遇到模型顶点数很多的时候需要用动态批处理的做法:

①将模型打散成多个子物体,每个子物体的定点数小于300;

②利用多维子材质,给模型的所有子物体赋同一个多维子材质球,每一个材质球的都为单通道的即可。

3.4、当场景中有多类武器,每类武器会同时在场景中存在多个的情况时,就可以利用动态批处理。

3.5、批处理只能降低DrawCall不能降低CPU计算的顶点数。不能光盯着DrawCall的优化,要兼顾顶点的优化,顶点数多CPU计算量同样会上升。

3.3、天空盒占用一个DrawCall,因为天空盒的CubeMap用了一个单通道的Shader。

3.4静态物体不能动态加载。

4、什么情况下需要把小图的标签设置为一个(打包):图片的类型、压缩方式、透明、是否在同一个界面等可以放到一张大图中。如果一张图片在几个界面都用,不如不打包这张图片了,Unity打包策略:尽量将所有图放到一张大图中,图片过多放到多个包中。

5、图集:

6、因为每一个小方格都有单独,单独做成类。

7、读取单个精灵用Load,读取精灵图集用LoadAll。

8、所有数据中,能快速定位数据的为字典集合,比数组快多了。
--------------------- 
作者:leonardo_Davinci 
来源:CSDN 
原文:https://blog.csdn.net/leonardo_Davinci/article/details/78516955?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/alone_ws/article/details/83108690
今日推荐