热更

2.1k words

Desc:

Manifest

储存着所有AB和AB之间的依赖关系

AssetsPathMapping

包含着资源路径到AB的路径映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ResourcesMapItem
{
public string assetbundleName;
public string assetName;
}

//资源路径对应mapItem
protected Dictionary<string, ResourcesMapItem> pathLookup = new Dictionary<string, ResourcesMapItem>();
//ab包对应的资源
protected Dictionary<string, List<string>> assetsLookup = new Dictionary<string, List<string>>();
//资源对应的ab包
protected Dictionary<string, string> assetbundleLookup = new Dictionary<string, string>();
protected List<string> emptyList = new List<string>();

资源异步加载

AssetBundleManager.LoadAssetAsync(assetPath,assetType):
·编辑器模式下,根据路径获取;如果是图集,则加载所有图片;不是则加载资源,返回一个加载器
·发布版本模式下,根据资源得到ab包,判断ab包是否存在,如果存在则判断是否还在内存中,返回加载器

prosessingWebRequester:
prosessingAssetBundleAsyncLoader:
存储目前进行的ab加载器(AssetBundleAsyncLoader)
初始化时,判断本身是否在内存中,并加载依赖项
进度,当前等待列表中已经加载的比例
更新:判断等待列表是否为0
prosessingAssetAsyncLoader:
存储目前进行的资源加载器(AssetAsyncLoader),会创建ab加载器,等到ab加载器执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//更新加载器状态
void Update()
{
OnProsessingWebRequester();
OnProsessingAssetBundleAsyncLoader();
OnProsessingAssetAsyncLoader();
}
void OnProsessingAssetAsyncLoader()
{
for (int i = prosessingAssetAsyncLoader.Count - 1; i >= 0; i--)
{
var loader = prosessingAssetAsyncLoader[i];
loader.Update();
if (loader.IsDone())
{
prosessingAssetAsyncLoader.RemoveAt(i);
}
}
}

版本更新

AssetbundleUpdater.cs
StartCheckUpdate://检查更新
InitLocalVersion();//初始化本地版本号
ChannelManager.Instance.IsInternalVersion();//获取服务器版本号
needDownloadGame=//检测App版本号
needUpdateGame=//检测资源版本号
CompareVersions();//比对资源哈希,不同或不存在则加入到更新列表中
//增量更新
Update中,创建加载器拉去web资源到本地,拉去成功后替换本地的ab

热修复

HotfixMain.lua 存储着需要被加载的热修复模块
Start():
遍历模块,调用 Register 方法
Stop():
遍历模块,调用 Unregister 方法

1
2
3
4
5
6
7
8
9
10

local function Register()
xlua.hotfix(AssetbundleUpdater, "TestHotfix", AssetbundleUpdaterTestHotfix)
util.hotfix_ex(AssetBundleManager, "TestHotfix", AssetBundleManagerTestHotfix)
end

local function Unregister()
xlua.hotfix(AssetbundleUpdater, "TestHotfix", nil)
xlua.hotfix(AssetBundleManager, "TestHotfix", nil)
end

链接

github