【Unity】聊聊资源打包、加载、热更

2023-12-14 12:44:07

分包策略:资源的冗余度和加载效率的平衡点如何去选

常用算法:递归算法和图算法

【03:00】李彬: 先说打包方法吧,早起天龙手游用的U4版本打包有很大的问题,等我们升到U5的时候,最早的时候考虑过用图去算资源的依赖关系,然后再去决定拆分打包,这个东西会有一个隐含的问题就是,这个依赖关系的可用性并不强,特别是在上线热更的时候发现,一但有资源变动,依赖关系变动比较大。后来我们采用了一个比较简单的策略,就是这一个资源到底依赖多少资源,如果超过一定量了以后我们打成一个包,如果不超过一定资源,那么它就是一个独立包。使用这样的打包策略,包的粒度会比较小,那么它在现在的时候相当于卸载单个AB包会比较干净,好处就是,内存会达到一个更节省的状态,因为一个bundle特别小,缺点就是AB包的量级比较大。后来Unity把这个IO打开策略给改了,它每次加载文件的时候对内存影响并不大。后来我们发现去查找这个文件消耗比较大。针对这个问题我们做了一个package系统,这个package就是我们把所有包的依赖关系打成一个文件,去节省查找的时间。

第二个问题包体大小这一块,当初我们尝试过用比较大的包,后来我们发现AB包在加载的时候,根据不同的系统和机型对单个AB包的asset数量是有严格限制的,后来我们在所有主流机型上测试过,当单个AB包超过200M时IO访问不出来。后来我们把单个AB包大小下降到10M以内,后来我们了解到Unity官方给出的建议也是10M以内。但反过来说,引擎的底层也是可以修改的,因为我以前看过祖龙的项目,祖龙所有用U3D开发的项目他们把这个包做了一个PNG格式的假后缀,每一个文件的大小都超过了100M,如果我们不像天龙一样修改引擎底层的话,AB包体一定不能太大,否则会加载失败,我建议是每一个包的大小是10M以内比较合适。刚刚聊的这些分包和打包的策略是我们现在用的方法。【07:00】

主持人:谢谢李彬的分享吗,现在邀请王立介绍一下轩辕剑的策略。

【07:00】王立:其实我们这边的方式和天龙的有点类似,AB包也是打的很碎,差不多有2万-3万个文件。实际上我们测出来最大的问题是IO频繁开启和关闭,我们的内存管理进出相对比较频繁,AB包加载和释放会导致IO的开启和关闭,针对这一个问题。我们的策略是做一套延迟卸载的机制,我们做了一个类似LRU就是内存缓存的剔除算法,尽量满足它们剔除的关系保持一个相对平衡的状态,因为IO频繁的开关对性能和电量消耗很大。所以我们项目主要改变的地方在这个方面做了一个更深层的缓存,这个缓存机制不是基于我们使用Obj标记,Obj使用一定是在场景中,但在Obj不使用的时候AB包是要剔除掉的。这个AB是否被剔除出去要看当前资源的使用情况,如果条件较为宽松就不剔除。所以在这里我们多加了一层分级。针对这些文件打包的时候我们要考虑上线热更的问题,这个对我们来说是一个比较关心的话题,所以我们在做的时候,我们的包名都是定义好的,除非这个AB包的引用关系发生了极大的变化,否则它的MD5码是保持不变的,可以说肯定不变。【10:00】

【10:00】仓强:我听大家的方式都是用多级多层次的方式去管理加载,我觉得咱们打包还是要考虑咱们最终的渲染路线是什么样子,我们用什么方式去管理每一个drawcall,在这个drawcall里面,我们怎么把这些资源去打到一个AB包里,根据这个原则我们再去做一些分包策略,这个策略我们也去PF项目做一个尝试。如果后期我有了经验再给大家做一个分享。

【11:00】PZ主程:这边和天龙的模式是一样的,一开始我们想要一个0冗余打包方案,后来我们也是发现,因为一个资源的变动导致资源的依赖变化特别大,后来我们把这个方案废弃掉了,我们想要的方案既要实现0冗余,还有不希望AB包过多,AB包过多会有IO的问题,首先我们先把这个冗余关系拆出来,其实我们的方案是基于文件夹打资源包,我们能保证的是在大版本更新的时候我们的老文件夹保持不变,新的资源添加到新的文件夹里。这个方案能解决之前资源依赖过于复杂的问题。打出来的AB包基本是不动的。虽然不能保证加载的包全部都是有用的,但美术放资源的时候其实是一类资源放一个文件夹,所以基本上有效资源覆盖率还挺高的,而且现在AB包都用的是LZ4压缩方案,所以在加载AB包的时候内存消耗还能接受,0冗余和报的依赖我们是建立在斌哥的基础之上。因为我们的场景文件比较大,场景贴图也只能放到stream包里,然后打完一个包20多M,我们也不知道上线的时候会不会出问题。我们的场景也是打的AB包,而且这个AB包是不能拆的。【13:52】

【31:50】刚才说的分包加载我们以前也做过,我们有一个规定,把内存的60%的固定给一些大的块使用,40%做一个IO的切换去加载和释放,

【36:06】聚变:之前我们针对低端手机,1-2G他们的CPU比较落后,bundle包加载压力非常大,

文章来源:https://blog.csdn.net/liuyongjie1992/article/details/106499251
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。