IEnumerator LoadAssetBundle(string relativeUrl)
    {
        XLoadCache loadCache;    
        if (!AssetBundlesCache.TryGetValue(RelativeResourceUrl, out loadCache))
        {
            loadCache = new XLoadCache() { RelativeUrl = RelativeResourceUrl, Ab = null };
            AssetBundlesCache[RelativeResourceUrl] = loadCache;

            CWWWLoader wwwLoader = new CWWWLoader(FullUrl);
            while (!wwwLoader.IsFinished)
                yield return null;

            // 解密
            CAssetBundleParser parser = new CAssetBundleParser(RelativeResourceUrl, wwwLoader.Www.bytes);
            while (!parser.IsFinished)
            {
                yield return null;
            }

            if (parser.Bundle == null)
                CBase.LogError("WWW.assetBundle is NULL: {0}", FullUrl);

            loadCache.Ab = parser.Bundle;

        }
        else
        {
            if (loadCache.IsLoadedFinish)
            {
                yield return null;  // 确保每一次异步都延迟一帧
            }

            while (!loadCache.IsLoadedFinish)
            {
                yield return null; //Wait
            }
        }

        Bundle = loadCache.Ab;

        if (Callback != null)
            Callback(FullUrl, Bundle, CallbackArgs);
    }