Unity加载优化-将基于LZMA的ab压缩方案修改为LZ4压缩的过程

本文介绍了如何通过将LZMA压缩方式改为LZ4来优化游戏在iPhone6上的内存溢出和加载速度问题。LZ4的块压缩方式提高了读取效率,允许只加载AssetBundle的Header,减少内存占用。同时,通过弱引用管理资源,避免了复杂的引用计数系统,进一步优化内存。在场景卸载后,使用Unity的UnloadUnusedAssets配合弱引用实现资源的有效释放。通过这些改动,游戏的加载速度和内存管理得到了显著改善。

# 观前提示

本文适合需要了解LZMA以及LZ4进行ab打包方案同学,以及会将一些资源管理的方案。如果恰好你也用xlua-framework,那就更适合你了。

# 优化起因

最近新游戏在Iphone6上出现了闪退的情况,出现闪退是在加载完成后的一瞬间,用脚指头想都知道内存超过上限了,查了下Iphone6内存为1GB,可使用最大内存上限为645M,理应是一个很高的内存值,由于新游戏是一款3d大地图城建游戏,模型建筑特别多,内存也出现溢出。这让我不得不想办法优化内存以及加载速度,一般的内存优化是从纹理,模型,动画这些资源下手,但是还没等我查到这一步,就发现之前使用的框架存在很大的内存优化空间,所以就有了这一篇优化文章。

# 优化前的情况

之前使用的框架叫xlua-framework,框架逻辑还是挺清晰的,可以再次基础上修改出比较好的框架。这次也是基于此进行优化,虽然是基于框架进行优化,但是主要还是将LZMA到LZ4压缩方案需要注意及修改的地方。

老框架使用LZMA压缩方式,游戏加载的时候先通过UnityWebRequestAssetBundle接口对AssetBundle进行全量加载,加载后缓存AB包,然后再将AB包内所有资源进行缓存。这个时候AB包,以及AB包内所有资源都在内存中。另外通过引用计数去维护资源,在切换场景的时候尝试卸载没有使用的资源,如果一个AB没有一个资源被使用就把这个AB卸载。

### 问题

1.LZMA采用流压缩方式(stream-based),压缩率会比LZ4更高,体现在包体更小,但是问题也很严重。LZMA只支持顺序读取,所以加载AB包时,需要将整个包解压,会造成卡顿和额外内存占用。这也是为什么在有些复杂UI上首次打开会造成卡顿。

2.加载AB包后将所有资源进行了缓存,导致了如果AB包资源利用率在短时间利于率不高的时候,造成了很高的内存浪费。

3.一套引用计数规则非常复杂,当

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值