unity性能优化

真机上跑,看Unity Profiler,确定瓶颈,再针对性的优化。

CPU

问题:短时间内计算量大,导致跳帧;发热严重,耗电高
解决:

  1. 数据缓存,内存池
  2. 分帧,将计算分到多个逻辑帧中进行计算,避免短时间内的性能超过负荷
  3. 使用合理的算法和数据结构,优化排序算法

GPU

问题:发热严重,耗电高;FPS降低
解决:

  1. 优化美术资源,合理规划图集,减少不必要的骨骼,优化模型片面数,优化粒子效果
  2. 贴图压缩,Android采用ETC2 8bit;IOS采用PVRTC
  3. 音频压缩,mp3
  4. 能合并的mesh尽量合并,减少DrawCall
  5. 使用光照贴图,LOD,使用shader,使用预设
  6. 遮挡剔除

LOD(Level of Detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

什么是DrawCall?
Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。

降低DrawCall的方法

  1. 静态批处理,使用相同材质的静态对象设置static
  2. 动态批处理,引擎自动进行的,存在约束(对象顶点数限制;不要使用缩放;多通道的shader等)
  3. 高级特性shader降级为统一的低级特性的shader

内存

问题:闪退或卡死
解决:
1. 动态加载和卸载资源,比如切换场景的时候强制垃圾回收
2. 压缩自带类库
3. 将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉
4. 释放AssetBundle占用的资源
5. 降低模型的片面数,降低模型的骨骼数量,降低贴图的大小
6. 使用光照贴图,使用LOD,使用Shader,使用Prefab

网络IO

异步加载,使用协程加载


UNITY3d在移动设备上的一些优化资源的方法

  1. 使用assetbundle,实现资源分离和共享,将内存控制到200m之内,同时也可以实现资源的在线更新
  2. 顶点数对渲染无论是cpu还是gpu都是压力最大的贡献者,降低顶点数到8万以下,fps稳定到了30帧左右
  3. 只使用一盏动态光,不使用阴影,不使用光照探头
  4. 粒子系统是cpu上的大头
    • 剪裁粒子系统
    • 合并同时出现的粒子系统
    • 自己实现轻量级的粒子系统
  5. Animator也是一个效率奇差的地方
    • 把不需要跟骨骼动画和动作过渡的地方全部使用animation,控制骨骼数量在30根以下
    • animator出视野不更新
    • 删除无意义的animator
    • animator的初始化很耗时(粒子上能不能尽量不用animator)
    • 除主角外都不要跟骨骼运动apply root motion
    • 绝对禁止掉那些不带刚体带包围盒的物体(static collider )运动
  6. NUGI的代码效率很差,基本上runtime的时候对cpu的贡献和render不相上下
    • 每帧递归的计算finalalpha改为只有初始化和变动时计算
    • 去掉法线计算
    • 不要每帧计算viewsize 和windowsize
    • filldrawcall时构建顶点缓存使用array.copy
  7. 代码剪裁:使用strip level ,使用.net2.0 subset
  8. 尽量减少smooth group
  9. 给美术定一个严格的经过科学验证的美术标准,并在U3D里面配以相应的检查工具

猜你喜欢

转载自blog.csdn.net/crayon_chen/article/details/80151137