【Unity】入门学习笔记180626——项目优化策略

项目优化技能是优秀研发人员的基本素质,除了遮挡剔除(Occlusion Culling)和层次细节(LOD)外,还可以从以下六个方面进行归纳和总结

# DrawCall

# 模型/图像方面

# 光照与摄像机处理

# 程序优化方面

# Unity系统设置

# 开发与使用习惯


1、DrawCall

一个模型的数据经过CPU传输到GPU,并命令GPU进行绘制,称为一个DrawCall。

这是一个CPU调用底层图形接口、绘制游戏对象的过程。对于GPU来说,一个游戏对象与大量游戏对象,其图形处理的工作量是一样的,所以尽量减少CPU在调用图形接口上的开销,每个游戏对象尽量减少渲染次数,多个游戏对象尽量一起渲染。

一般项目中,角色和场景是最消耗资源的两个方面,其中角色是CPU的瓶颈,场景是GPU的瓶颈。项目的优化与降低DrawCall的总体思路就是对美术资源进行梳理,使用大量合并DrawCall、人物角色减少材质与纹理的依赖和简化多余特效等方法。

具体途径:

①DrawCall批处理(DrawCall Batching技术)

    Unity运行时可以将一些游戏对象进行合并,把多个游戏对象打包,在使用一个DrawCall渲染它们,称为“批处理”

    批处理技术的核心就是在可见性测试之后,检查所有要绘制的对象材质,把相同材质分为一组,然后组合成一个对象

    Unity提供了“动态批处理”和“静态批处理”两种方式,动态是完全自动进行的,对于顶点数在900以内的可移动物体,只要使用相同的材质,就会组成批处理。静态则需要把静止的物体标记为静态,勾选Static

②使用图集(Texture Paching或Texture Atlasing),减少材质的使用

    Unity判断哪些游戏对象进行批处理,一般根据这些对象是否具有共同的材质和贴图,所有需要在场景中尽可能地复用材质到不同地对象上。

    有效利用批处理,首先是尽量减少场景中使用材质的数量,即尽量共享材质,对于仅纹理不同的材质可以把纹理组合到一张更大的纹理中(称为图集)然后把不会移动的物体标记为Static

③尽量少用反光与阴影,因为那会使物体多次渲染

④视锥体合理裁剪

⑤遮挡剔除方法

⑥网格渲染器

    把暂时无须显示的游戏对象使用脚本的方式控制不进行渲染,需要的时候渲染

⑦减少游戏对象的缩放

    统一缩放的对象不会与非统一缩放的对象进行批处理

⑧减少多通道Shader的使用

    多通道的Shader会妨碍批处理操作

⑨脚本访问材质的方法

    如果需要通过脚本来访问复用材质属性,那么如果使用Renderer.material来改变贴图将会造成一份材质属性的更改。

    因此一般应该使用Renderer.sharedMaterial来保证材质的共享状态。

⑩尽量多使用预设Prefab

    

2、模型/图形方面

①模型几何体的优化

    #模型的顶点与三角形面片的数目等不要太多,可能的话,把相邻的对象(网格)合并为一个

    #蒙皮动画模型的优化,建议每个角色仅使用一个蒙皮网格渲染器来绘制。在此情况下,Unity会使用可见性裁剪和包围体更新的方法来优化角色运动。角色的面数一般不要超过1500,骨骼数量少于30,角儿材质数量一般1~2个为最佳

    #压缩面片

    #避免大量使用Unity自带的Sphere等内建游戏对象

②贴图(纹理)优化

    #使用贴图压缩优化

    #贴图(纹理)压缩格式选择

    纹理方面,使用压缩纹理,对于不透明贴图,压缩格式建议为ETC 4bit,对于透明贴图,我们只能选择RGBA 16bit或32bit

    贴图的格式,从事手游开发,建议设置为PNG或TGA格式

    #选择支持Mipmap

    虽然这种做法会增加一些应用程序的大小,但在游戏运行时,系统会根据需求应用Mipmap来渲染,从而减少内存的带宽需求

③材质

④碰撞体

⑤粒子系统

    最大粒子数建议小于200个粒子,每个粒子发射器的最大粒子数建议不超过50个

    对于非常小的粒子,建议粒子纹理去掉Alpha通道,尽量不开启粒子碰撞功能

⑥其他

    尽可能多地使用预设体,不要再静态物体上添加Animation组件


3、光照与摄影机方面

①渲染途径

    渲染途径用于决定灯光和阴影在场景中地计算方法,Unity中主要提供了3种渲染途径,分别是“顶点光照”、“前向渲染”、“延时光照”

    #延时光照

    具备最高地保真度与真实感地渲染途径

    #前向渲染

    是一种保持较高光照效果与较高系统性能地综合平衡选项

    #顶点光照

    最低保真度光照,基本已经弃用

②光照与阴影方面

    光线性能地消耗占用顺序为:聚光灯、点光源、平行光

    像素的动态光照将对顶点变换增加显著的开销,所以应尽量避免任何给定的物体被多个光源同时照亮的情况

    对于静态物体,采用光照烘焙的方法则更为有效的方法

③摄像机技巧

    Unity提供了可以根据不同的层来设置不同的显示距离,我们可以将游戏对象进行分层,大物体层设置的可视距离大些,而小物体层可以设置地小些,一些开销比较大地实体(如粒子系统)可以设置得更小些。


4、程序优化方面

①程序整体优化方面

②事件函数方面

③数学计算方面

④垃圾回收机制方面


5、Unity系统设置

①限帧措施

    Edit → ProjectSetting → Quality 中的VSync Count 参数会影响FPS

    Every V Blank 相当于 FPS=60,EverySecondVBlank=30

    手动调整FPS,首先关闭垂直同部功能,然后再代码Awake方法手动设置FPS

②物理性能优化

    设置了FPS后,再调整下Fixed Timestep参数

    Edit → ProjectSetting → Time 目的是减少物理计算的次数来提高游戏性能

③调整像素光数量

    Edit → ProjectSetting → Quality 调整像素光的数量来取得一个性能和质量的均衡点


6、良好的开发与使用习惯

    #养成良好的标签、层次和图层的条理化习惯

    #项目研发过程中就养成经常通过stats和profile技术查看项目的效率瓶颈的习惯


猜你喜欢

转载自blog.csdn.net/Dylan_Day/article/details/80802964