如果AssetBundle打包使用的是自动分类,而不是手工设置的方式,几乎不可避免的是导致打出来的包会有循环引用。即使我们给美术制定了一系列的标准用来避免这种情况,但你懂的...
若AssetBundle有循环引用,在加载的时候会很麻烦。那么我们就需要在制作阶段能够自动检测到AssetBundle的循环引用。并且给出提示,方便人工把循环引用给断掉。
一般逼格比较高的方式是使用有向图的闭环检测算法来做,但是我们农村人哪里懂这个。这方法太高深玩不来。
那就只能上土方法了
研究下AssetBundle的正常引用 关系和循环引用关系我们就能发现:
在一个正常的AssetBundle引用关系中:
- 从任何一个AssetBundle出发,往下走,任何方向都是一条断头路
- 从任何一个AssetBudnle出发,往上走,任何方向都是一条断头路
有这两条,就可以得到推论:
遍历所有AssetBundle,删除掉没有引用或没有被引用的节点,最终将一个不剩。而如果有剩下,那么这些剩下的AssetBundle一定是陷在循环中的,或者是与循环中的AssetBundle有关联的。
这里只是想把我的思考过程写一下。最终其实就是:模拟一次AssetBundle的加载,如果都能加载完,那就不存在循环引用
- 删除没有引用的节点,就是模拟加载过程
- 删除没有被引用的节点,只是为了减少不在循环中,但是被循环中的节点关联的节点的数量
将剩余的AssetBundle输出,就可以知道哪些是陷在环里了。
http://www.virtualhu.com/blog/?p=1