最近在学习Unity3D时,提到了性能优化,刚学习Unity时,只知道对象池可避免重复的删除和重建,今天又重新总结了一下,才知道,原来性能优化还有这么多方式
不过最主要从三个方面进行:
一、从CPU方面考虑
二、从GPU方面考虑
三、从内存方面考虑
下面分别从三方面进行总括:
1、先大概从CPU方面概括:
(1)主要是指计算有关的部分
(2)代码部分
①删除一些空的方法,如Update
②使用for循环代替foreach,使用List代替ArrayList尽量少使用封箱拆箱操作
③可以Break掉的循环,直接退出,减少不必要的循环
④少使用复杂运算,如除法、开平方根、反余弦、可以使用+、*代替
⑤FixedUpdate等频繁调用的方法可以扩大间隔、可以使用协程、Invokerepeating
⑥OnGUI,最好只在一个脚本中出现
⑦OnBecameVisible当物体被相机看到时才执行一些操作,常用于AI
⑧不使用打印,不出现警告
⑨不能频繁的获取组件,创建新的对象,使用全局变量代替
(3)物理系统
①碰撞检测方面,使用离散的
②碰撞器不使用MeshCollider,使用简模代替
(4)粒子系统
①减少粒子数量、缩小效果
(5)动画方面
①使用简单的动画
(6)Shader方面
①尽量使用一些简单的算法,不使用复杂的效果
②尽量不使用透明的处理
③减少屏幕特效的复杂运算
(7)灯光
①不使用实时阴影,使用Mixed
2、从GPU方面:
(1)、主要是渲染方面
(2)、批处理
①动态批处理:要求比较高,对面数、定点数、材质球都有要求
②静态批处理:
1)把不动的物体标记为Static
2)相同材质球、相同预设物
(3)、减少模型数量、骨骼数、片面数,使用法线贴图代替细节模型
(4)、减少场景的大小、树、草
(5)、灯光烘焙
①光照探测
(6)、遮挡剔除Occlision
(7)、LOD、MipMap(会增大内存)
(8)、减少镜头特效
(9)、减少透明效果、反射效果
(10)、减少不必要的层级:打包图集,一个图集最好不要超过1024*1024
(11)、使用序列帧动画代替粒子系统(增大内存)
3、从内存方面
(1)空间、存取速度方面
(2)使用对象池,减少对GC使用
(3)使用stringBuilder代替string
(4)减少图片尺寸,压缩图片
(5)简模
(6)Dll,减少使用多余的类库,使用小的类库
(7)删除不必要的资源,如一些事例
(8)使用动态加载
(9)使用全局变量
(10)使用内存空间小的类型
以上只是学习中总结的一个概论,详细内容可在网上了解