unity性能优化方向
如果资源没有加载完成,Instantiate实例化之前会先加载资源,就会拖慢速度,所以我们需要根据配置在加载关卡时预加载这些资源。一个节点更新会导致整个canvas重建,虽然每个canvas占用了一个drawcall,但也要注意不要堆积太多不相关的模块在同一个canvas导致重建频繁。Mono虚拟机在我们释放内存后不会降低内存消耗,即只增不减,避免提高Mono中内存的峰值。一般用于场景和角色,内存
1 Cpu
1.1 渲染
1.1.1 降低drawcall
通过batch合批来降低; 注意总线带宽不要合批后让gpu压力过大
降低渲染物体数量;
1.1.2 资源优化
不合规范的网格、纹理等等
1.1.3 LOD
近距离物体用高精度,远距离物体用低精度模型
1.1.4 遮挡剔除
被完全遮挡的物体不渲染
1.1.5 远距离剔除
太远的物体不渲染,也适用于计算,比如MC的区块机制
1.2 UI
1.2.1 合批
UI注意图集分配,还有一些特殊的组件像mask、outline之类会打断合批
1.2.2 重建
一个节点更新会导致整个canvas重建,虽然每个canvas占用了一个draw call,但也要注意不要堆积太多不相关的模块在同一个canvas导致重建频繁。
1.3 加载
1.3.1 包体依赖
如果没有正确的包体依赖关系,将会导致原本公用的资源被打包N次
1.3.2 预加载
如果资源没有加载完成,Instantiate实例化之前会先加载资源,就会拖慢速度,所以我们需要根据配置在加载关卡时预加载这些资源。反正loading中慢就慢了。
1.3.3 代码效率
算法多考虑时间复杂度,update中的计算慎重一些,能缓存的值不要每次都算。
1.3.4 对象池优化
Destory物体也会拖累cpu,可以考虑对象池复用,缓释池子来慢慢释放。同时间点大量销毁物体会卡顿
2 Gpu
2.1 减少渲染像素
2.1.1 贴图优化 减少面积
去除透明无效区域
2.1.2 增加顶点 减少面积
2.1.3 订制shader 减少面数
避免多张纹理叠加,订制shader从多张纹理采样
2.1.4 UI
九宫格镂空,避免mask,剔除透明按钮
2.1.5 减少shader复杂度
2.1.6 HSR优化
2.1.7 减少不必要的后处理
2.1.8 Mesh代替Alpha Test
2.1.9 带宽瓶颈
1.减少Cache miss
2.开启mipmap
3.使用硬件压缩格式,在可接受范围尽量用更大的压缩率
4.使用九宫格sprite减少UI贴图大小
5.检查贴图,避免过大的贴图
6.减小Lightmap 尺寸
7.使用Occlusion culling减少渲染目标
8.使用LOD 网格
9.使用gpuinstancing代替网格合并
10.降低分辨率
11.尽量使用常量寄存器实现gpu instancing
3 内存
内存大概分配 Mono33% 纹理33% 其他33%
3.1资源内存
3.1.1 纹理
3.1.1.1 纹理压缩格式
考虑ETC2,ASTC
3.1.1.2 纹理尺寸
能小就小
3.1.1.3 mipmap
一般用于场景和角色,内存会增加1.33倍,注意对UI无效,UI不要开启
3.1.1.4 Read & Write
开启读写会增加一倍内存消耗
3.1.1.5 资源冗余
实例化修改材质、ab包策略等导致资源重复占用内存
3.1.2 网格
3.1.2.1 Normal、Color和Tangent
对于不需要的属性不要导入
3.2 引擎模块自身内存
3.2.1 ab包实例释放
合理的ab包管理策略,避免内存泄漏
3.2.2 合理的组件管理
对于废弃的物体第一时间清理掉
3.3 托管堆内存
3.3.1 避免分配大量不必要的内存
Mono虚拟机在我们释放内存后不会降低内存消耗,即只增不减,避免提高Mono中内存的峰值。
3.3.2 避免高频函数分配内存
各种update里分配内存要慎重
更多推荐
所有评论(0)