性能优化——移动端(资源,Shader,光照及渲染)建议

性能优化——移动端(资源,Shader,光照及渲染)建议

前言:本文为进行PICO G2(VR一体机的一种,适用安卓系统)项目开发时,整理总结的优化建议。部分参数PC项目上可以不使用这么低的配置。

文章目录

  • 性能优化——移动端(资源,Shader,光照及渲染)建议
  • 一 PICO 官方建议:
    • 1.场景:
    • 2.优化方法举例:
  • 二 个人总结
    • 1.美术资源:
      • 1.1 动态物体
      • 1.2 静态物体
      • 1.3 纹理贴图
    • 2.音频相关
    • 3.灯光相关
    • 4.引擎相关
      • 4.1 相机
      • 4.2 粒子特效
      • 4.3物理引擎
      • 4.4 渲染优化
      • 4.5 Shader相关优化
      • 4.6遮罩剔除 Occlusion :
      • 4.7 LOD:
      • 4.8 Quality:
      • 4.9 打包图集:
    • 5.代码相关优化
      • 对象池
    • 6.循环相关:
    • 7.实例化相关:
    • 8.局部数据相关:
    • 9.资源加载相关:
    • 10.组件相关:
    • 11.渲染管线及插件使用注意事项:
      • 渲染管线:
      • 11.1 WRPL:
      • 11.2 HDRP:
      • 11.3 URP:
    • 12.Unity插件相关:
      • 12.1 Post-Processing:
      • 12.2 高亮插件:
    • 13.Unity版本相关介绍
      • Final:最终版
      • LTS:长期稳定支持版
      • Patch:补丁版
      • Beta:外部测试版
    • 14.性能分析器Profiler工具内部分参数介绍

一 PICO 官方建议:

Pico场景帧率不得低于30帧,建议45帧以上。(建议以实际运行时流畅度为准)

1.场景:

模型三角面片控制在10万以内
模型顶点数控制在10万以内
普通unity灯光例如电光源数量控制在50以内
普通unity粒子系统数量控制在50以内
Unity shader尽量使用效率较高的

2.优化方法举例:

在保证显示的情况下减少模型面片顶点数量
尽量共用材质,动画
尽量使用压缩纹理格式
尽可能少的使用灯光特效等
尽量使用静态批处理
脚本优化,减少不必要内存,计算等资源消耗

注:PICO SDK内有锁帧情况(锁定在60),在PC端运行时 CUP FPS维持在60/61此为正常现象,并非只能跑到60。

二 个人总结

1.美术资源:

1.1 动态物体

参考类:游戏角色,敌人,NPC等
面片数 :300-2000面片
SkinnedMeshRenderer:1个
材质数量:1-3个
谷歌数量:少于30根

1.2 静态物体

一般静态物体 :网格定点少于500个
标记为Static:StaticBatching
Animation组件:模型上的,如果不需要使用尽量不要附加,节省性能。

1.3 纹理贴图

纹理贴图:尽量采取压缩格式
纹理尺寸:长宽小于1024,在保存正常显示的基础上尽量小够用就可以。
Mipmap:Mipmap可能会增加程序大小,但提高渲染效率。

2.音频相关

时间长的音频:.ogg或者.mp3的压缩文件格式
时间短的音频:.wav或者aif格式的未压缩文件

3.灯光相关

光源设置:
总要求:在满足效果的情况下,控制光源个数。
设置:ProjectSetting- Quaity中PixelLightCount设置为1-2个

4.引擎相关

4.1 相机

剪切平面设置合理,根据场景不同进行修改。

4.2 粒子特效

粒子总数:建议少于200
单个粒子发射器发射粒子总数:建议少于50
粒子大小:尽量小。非常小的粒子纹理中科院除去Alpha通道。

4.3物理引擎

碰撞体控制: 尽量使用Sphere 和Box Collider,避免MeshCollider.

4.4 渲染优化

避免使用:Alpha Test和Alpha Blend。若使用则像素数降至最低。
Alpha Test性价比低,可用Alpha Blend代替。

4.5 Shader相关优化

总体理念:更少的数据达到相似的效果。
尽量减少使用透明通道。
如单面显示不影响效果就尽量使用单面显示而不用双面显示。
光照函数改变fload为Fixed,使用精度更低的数值类型
表面函数改为fixed
单一光源: Light Count Single Directional
逐顶点:Geometry 不勾选Per-pixel screen coordinates为逐顶点渲染,勾选为逐像素渲染。后者性能消耗大,不是贴屏使用或者近距离观察不必使用逐像素。
光源渲染模式时:RenderMode 使用important则为使用逐像素。
不使用延时渲染Deferred,使用向前渲染Forward。
使用半矢量 halfasview
根据项目实情考虑是否需要透明,非必须可去除透明通道。透明材质比普通材质消耗性能更多。

4.6遮罩剔除 Occlusion :

作用:相机前方被遮挡住不能观察到的物体不进行渲染。
方法:详细使用说明请参考文末链接或百度查找。

4.7 LOD:

作用:根据摄像机与模型的距离,来决定显示哪一个模型,一般距离近的时候显示高精度多细节模型,距离远的时候显示低精度低细节模型。从而降低模型的渲染消耗。
方法:详细使用说明请参考文末链接或百度查找。

4.8 Quality:

作用:通过调整Levels级别来调整渲染效果及性能消耗。默认使用medium 级别(移动端不推荐设置为最高)。
参数:详细参数说明请参考文末链接或百度查找。

4.9 打包图集:

原理:绘制图像时需要提交图片到显存,然后进行绘制(这个过程称为一次DrawCall),如果一帧绘制50个则需要提交50次图片,如果图集包含了这五十个图片,则只需进行一次提交即可实现,
作用:降低渲染时drollcall的调用次数。
方法:详细使用说明请参考文末链接或百度查找。

5.代码相关优化

脚本:
5.1新建脚本时会自动添加Updata 如果不需要使用就删了。
5.2内部Debug.Log或者Print在测试好后注释或者删除掉。
5.3 协程比Invoke()性能开销大。如果可以替换尽量使用Invoke();

///对于并非每帧都要执行的代码可以用下列方法
////----------------定帧重复调用----------------------
void Update()
{if(Time.frameCount%6==0)
//TODO 执行方法}
//----------------定时重复调用----------------------
void Start()
{
 //方法一
 InvokeRepeating("方法名",0.5f,1.0f);//通过IncokeRepeating定时调用
 //方法二
 StartCoroutine(StartUpdate());//通过协程调用
}
IEnumberator StartUpdate()
{
 while(true)
 { TODO;
 yield return new WaitForSeconds(间隔时间);
 }
}

性能优化——移动端(资源,Shader,光照及渲染)建议_第1张图片
性能优化——移动端(资源,Shader,光照及渲染)建议_第2张图片

对象池

原理:需要大量生产或销毁物体时,可通过对需要销毁的物体进行失活并存入“池”中,再次使用时取出激活,来达到减少物体的创建和销毁减少性能消耗。
方法:详细使用说明请参考文末链接或百度查找。

6.循环相关:

每个继承MonoBehaviour的类,都会自动生成Update方法,但很多类是用不到Update的,这时候需要将其删除,毕竟实时调用空方法,多少还是有消耗的。
减少在Update和for循环内创建临时变量,用for代替较少foreach使用。
Debug做成dll或者调试完无问题的情况下删除。

7.实例化相关:

过快地创建或者移除过多的对象时优先使用
动态实例化到场景的物体,名字都会有一个后缀(Clone),有时候为了方便识别,会修改其名字,同样会产生性能消耗

8.局部数据相关:

使用结构体而不是类。类被储存在堆;而结构体被储存在栈。
可以参考ESC框架

9.资源加载相关:

性能优化——移动端(资源,Shader,光照及渲染)建议_第3张图片
谨慎使用静态对象(static),因为你在变化场景时不会被清理。如过单一场景则可忽略。
音效播放时,为避免频繁创建、销毁播放器,可以对音效统一管理。

10.组件相关:

Getcomponent的使用:
如果代码里面经常访问 某个组件(内置的如Tranfrom或者脚本)引用时,最好先在Awake或者Start里缓存这些组件(定义变量)。
直接使用属性访问稍微比GetComponenT快(变化不大)
如果某些组件一定存在可以使用属性访问,如果不一定存在如Collider,使用前需要判断是否存在时最好使用GetComponent去判断。
在场景中有大量物体频繁的激活或隐藏时,不使用SetActive(),在需要隐藏时移到屏幕外 ,显示时再移到屏幕内,即修改transform.position。

11.渲染管线及插件使用注意事项:

渲染管线:

11.1 WRPL:

Lightweight Pipeline轻量级渲染管线。对Unity2018兼容性不太好。咨询PICO技术支持后他们在空场景测试(仅放1个cube情况下)在54-58之间达不到60。在2019上可跑70左右。使用须亲自测试,整体不卡顿后方可使用。

11.2 HDRP:

High Definition Render Pipeline高清渲染管线。对大多数移动设备并不支持,并且使用该渲染管线项目开发时,部分全景视频录制插件无法正常录制(出现抖动等情况)。使用前请亲自测试,功能无障碍后再在项目中使用。

11.3 URP:

UniversalRP通用渲染管线,适用于2019.3及以上,通用于PC和移动端,以后可能成为默认内置渲染管线。适用性较好。

注:
1.因PackageManager在不同Unity版本中版本不同,如果使用不同版本Unity打开同一项目可能会导致PackageManager错误,无法正常显示和加载。eg:项目为2019.3.9创建,并使用了URP渲染管线 。当使用2019.3.6打开时,管线丢失,PakageManager打开无法正常显示,暂时没找到解决方法,直到再次下次2019.3.9打开才解决。
2.因自己编辑的Shader可能和渲染管线内使用的Shader不兼容。如确定使用渲染管线后,最好在项目开始时就导入,而非项目后期升级为使用渲染管线。

12.Unity插件相关:

12.1 Post-Processing:

后期处理插件:使用后在PICO内会导致掉帧情况。项目最终需要再PICO内运行,请亲自测试,如不卡顿后再在项目中使用。

12.2 高亮插件:

Highlighting+System确定在项目中使用前,请务必要空场景中打包测试,观察该插件在PICO中是否存在严重掉帧 情况(如:空场景使用该插件后才仅仅跑到30-40帧等情况)。
注:项目最终如需打包APK并在PICO中使用。插件在项目中正式使用前请务必在空场景中打包尝试,并导入PICO看是否存在不兼容掉帧等情况。否则后期可能会浪费大量时间来查找错误。

13.Unity版本相关介绍

Final:最终版

当前时间的一个最终版本,可能包含新的功能以及API的变更,详细信息可以参考发布说明。一般大的功能跨度都是在年度版本进行更新。

LTS:长期稳定支持版

LTS版本不会有新的任何功能,API变更或改进。不过次版本会解决崩溃,回归测试和开发者反馈的相关问题。
适用于正在开发以及已有发布的开发者。

Patch:补丁版

针对当前版本所存在的Bug进行一个修复。不会更改任何功能,API变更或改进。详细修复的bug可以查看相对应的发布说明。

Beta:外部测试版

此版本您可提前使用新功能并且可以帮助反馈使用中的问题来帮助开发人员完成最终版本。同时也预示着此版本的稳定性上可能不如最终版本

项目开发版本推荐选择:LTS。 如果需要使用新功能可酌情考虑Final。需要修复bug可适当升级Patch。

14.性能分析器Profiler工具内部分参数介绍

介绍内容为:
WaitForTargetFPS、Gfx.WaitForPresent 和 Graphics.PresentAndSync
详情请参考下列转载链接:

Profiler性能分析器部分参数: https://weibo.com/p/1001603954695990318082
遮罩剔除 https://blog.csdn.net/beihuanlihe130/article/details/75006865
LOD:https://blog.csdn.net/qq_35030499/article/details/87950030
打包图集: https://www.cnblogs.com/lmh-raymon/p/10095495.html
对象池:https://blog.csdn.net/wangjiangrong/article/details/80196676
Quality参数说明:https://blog.csdn.net/honey199396/article/details/49981255

声明:本文为个人笔记,用于个人学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系本人,违规必改。

你可能感兴趣的:(Unity,优化,unity,移动开发,内存优化)