现象
在开始排查当前情况的时候,项目工程中使用的lua代码已经达到了6M
在本地电脑中加载的时候需要5s以上的时长!据项目的反馈,手机上的加载时间有些机器需要十几秒!
排查过程
- 第一步是先统计一下加载的耗时
在 AddressResource
中,在创建和加载完成的两个方法中添加计时,完成的时候打印耗时;
- 确定ab的加载时间
ab加载耗时极少!
-定位加载过长的原因
通过断点,看到因为label
需要把所有的同样label
的资源都进行provider
加载,使得lua的每一个文件都会进行BundledLuaProvider
加载!而且还是异步的!
m_RequestOperation = bundle.LoadAssetAsync(assetPath, m_ProvideHandle.Type);
m_RequestOperation.completed += ActionComplete;
方案:
方案一:
直接将BundledLuaProvider
中从ab
回去资源的异步方式改为同步!
方案二:
lua
的加载不使用addressable
记载,类似于
string path = m_ProvideHandle.ResourceManager.TransformInternalId(m_ProvideHandle.Location);
if (File.Exists(path))
{
m_RequestOperation = AssetBundle.LoadFromFileAsync(path, m_Options == null ? 0 : m_Options.Crc);
m_RequestOperation.completed += LocalRequestOperationCompleted;
}
直接加载assetbundle
,然后对ab
进行操作,这样就可以自己处理了!
方案三:
使用工具,在打包lua
之前,将所有的lua
文件合并成为一个文件,这样的话一个lua ab
就只有一个asset
了(即lua
之类的label
加载的时候就只有一个provider
需要处理!),好处在于目前的addressable
不需要修改,只需要写个工具,还有在lua
资源加载完后解释就可以了
方案四:
修改addressable
的加载,但是里面牵连了AsyncOperationBase
、AsyncOperationHandle
、ProviderOperation
等一系列的操作,改动过大!
方案五:
在addressable
生成的catelog
进行删除修改,使得一个label
下只有一个asset name
,这样在调用BundledLuaProvider
的时候直接使用loadall
就可以了!
其他:
还有不少是基于addressable
的修改,但是改动都不少
结果
目前看来方案一
、方案二
、方案三
的可行性较高!
PREVIOUSGetPrivateStaticClass报错
NEXTC# 的UDP使用记录