项目性能优化记录随笔

内存
初始打出包后,发现闪退极其严重 。在手机上实测发现是内存问题。
1.开始查美术资源。发现因为项目要快速出效果,美术制作场景时使用了各种尺寸超大的贴图,且并未压缩,导致内存轻松超过警戒线。
2.代码框架。因为之前资源AB包卸载的时机是监控当前手机内存红线,而这个红线是一个配置值。其他时候加载过的AB都不会被卸载。导致内存越来越大。后来在切换场景时,手动调用内存释放的方法,强制卸载所有不被引用的AB资源。
3.rendertexture。这个主要体现在ShadowMap上。美术在制作场景时,只想着表现效果,用的实时光和实时阴影。而且在Directional Light的设置上,把Resolutiion设置成了最高的分辨率,这样导致Unity会生成一个4096*4096的render texture,这个图在内存中占用96M。后面会考虑用其他方式去替代。
4.shaderlab的内存占用。实际运行过程中,发现在主场景中shaderlab的内存占用有500M.这是因为美术赶工期,在场景中使用了大量的standard材质,而这些材质拥有大量的变体,没有做变体的处理,导致打包时把所有的变体全部编译并打包了。在加载时导致内存中出现了大量的shader变体,占用了大量的内存。

帧数
手机跑在核心场景时,用三星S8来测试,发现帧数非常低。通过真机的profile数据分析,发现Draw Call数量和脚本耗时并未非常高,耗时最高的是在Device.Present方法上。分析此时性能瓶颈是在CPU端。而此时看到平均每一帧渲染的面数是160万面。第一次分析问题出在面数太多了。
因此准备通过减少场景中渲染物体的个数,看是否能够提高帧数。
制作了测试场景后,将场景中渲染的物体个数大幅度减少,发现帧数并未有明显变化。因此,说明在三星S8上,面数并不是当前渲染的性能瓶颈。
一般常见渲染的瓶颈主要出现在内存带宽和填充率上。因此制作两个测试场景,一个是全局改变场景中所使用贴图的大小(更改QualitySettings.masterTextureLimit),另外一个是改变屏幕分辨率(Screen.SetResolution)。
经过测试,修改贴图大小对帧数的改变并没有明显的提升。而当修改屏幕分辨率后,帧数提升十分显著。因此,得出结论,当前场景的问题主要出现在填充率上。
因此,可以得出结论,我们当前场景绘制的内容过多,且肯定存在过度渲染的问题,猜测肯定也有很多无效的绘制。查看frame debugger,发现场景中把整个地形绘制了4遍。并且场景中的地形因为美术制作的时候赶工期,使用了terrian,并且场景中使用了水的效果,水的效果需要使用场景的深度图,且当前场景渲染的时候使用了实时阴影,综合各种效果,发现场景中的地形被渲染了4遍,其中有两遍渲染是完全没有生效的,只用到了深度信息。因此找到了帧数较低的核心问题所在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值