本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、ArrayList
ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理),装箱拆箱的操作(费时),List是泛型类,功能跟ArrayList相似,但不存在ArrayList所说的问题。
2、LOD
LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。缺点是增加了内存。
3、MipMapping
MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。
4、优化内存
- 压缩自带类库
- 将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉
- 释放AssetBundle占用的资源
- 降低模型的片面数,降低模型的骨骼数量,降低贴图的大小
- 使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)
- 代码中少产生临时变量
5、String、StringBuffer和StringBuilder
- String是字符串常量。
- StringBuffer是字符串变量 ,线程安全。
- StringBuilder是字符串变量,线程不安全。
- String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。
- StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。
6、资源优化
- 使用assetbundle,实现资源分离和共享,将内存控制到200m之内,同时也可以实现资源的在线更新
- 顶点数对渲染无论是cpu还是gpu都是压力最大的贡献者,降低顶点数到8万以下,fps稳定到了30帧左右
- 只使用一盏动态光,不是用阴影,不使用光照探头
- 粒子系统是cpu上的大头
- 剪裁粒子系统
- 合并同时出现的粒子系统
- 自己实现轻量级的粒子系统
- animator也是一个效率奇差的地方
- 把不需要跟骨骼动画和动作过渡的地方全部使用animation,控制骨骼数量在30根以下
- animator出视野不更新
- 删除无意义的animator
- animator的初始化很耗时(粒子上能不能尽量不用animator)
- 除主角外都不要跟骨骼运动apply root motion
- 绝对禁止掉那些不带刚体带包围盒的物体(static collider )运动
- NUGI的代码效率很差,基本上runtime的时候对cpu的贡献和render不相上下
- 每帧递归的计算finalalpha改为只有初始化和变动时计算
- 去掉法线计算
- 不要每帧计算viewsize 和windowsize
- filldrawcall时构建顶点缓存使用array.copy
- 代码剪裁:使用strip level ,使用.net2.0 subset
- 尽量减少smooth group
- 给美术定一个严格的经过科学验证的美术标准,并在U3D里面配以相应的检查工具