public virtual IProgressResult <float, RedundancyReport> AnalyzeRedundancy() { return(EditorExecutors.RunAsync <float, RedundancyReport>(promise => { try { long totalSize = 0; long redundantSize = 0; long objectTotalCount = 0; List <ObjectInfo> infos = new List <ObjectInfo>(); foreach (var bundle in container.Bundles) { foreach (var archive in bundle.AssetArchives) { totalSize += archive.FileSize; ObjectArchive objectArchive = archive as ObjectArchive; if (objectArchive == null) { continue; } var objectInfos = objectArchive.GetAllObjectInfo(); objectTotalCount += objectInfos.Count; foreach (var info in objectInfos) { if (promise.IsCancellationRequested) { return; } if (info.IsPotentialRedundancy) { infos.Add(info); } } } } Dictionary <IFingerprint, RedundancyInfo> dict = new Dictionary <IFingerprint, RedundancyInfo>(); int count = infos.Count; for (int i = 0; i < infos.Count; i++) { if (promise.IsCancellationRequested) { return; } var info = infos[i]; RedundancyInfo redundancyInfo = null; var fingerprint = info.Fingerprint; if (!dict.TryGetValue(fingerprint, out redundancyInfo)) { redundancyInfo = new RedundancyInfo(info.Name, info.TypeID, info.Size); dict.Add(fingerprint, redundancyInfo); promise.UpdateProgress((float)i / count); } redundancyInfo.AddObjectInfo(info); } List <RedundancyInfo> redundancies = new List <RedundancyInfo>(); foreach (var redundancyInfo in dict.Values) { if (redundancyInfo.Count <= 1) { continue; } redundancies.Add(redundancyInfo); var objectInfos = redundancyInfo.ObjectInfos; for (int i = 1; i < objectInfos.Count; i++) { redundantSize += objectInfos[i].Size; } } promise.SetResult(new RedundancyReport(totalSize, redundantSize, redundancies)); } catch (Exception e) { promise.SetException(e); } })); }
public PreloadData(ObjectArchive archive) { this.Archive = archive; }
public AssetBundle(ObjectArchive archive) { this.Archive = archive; }
public static IProgressResult <float> Load(this ArchiveContainer container, DirectoryInfo dir, IStreamDecryptor decryptor) { try { List <FileInfo> files = new List <FileInfo>(); foreach (FileInfo file in dir.GetFiles("*", SearchOption.TopDirectoryOnly)) { if (file.Name.EndsWith(BundleSetting.ManifestFilename)) { files.Add(file); continue; } if (file.Name.EndsWith(dir.Name)) { files.Add(file); continue; } } if (files.Count <= 0) { throw new Exception("Please select the root directory of the AssetBundle"); } files.Sort((x, y) => y.LastWriteTime.CompareTo(x.LastWriteTime)); if (files[0].Name.Equals(BundleSetting.ManifestFilename)) { BundleManifest manifest = BundleManifest.Parse(File.ReadAllText(files[0].FullName, Encoding.UTF8)); return(container.LoadAssetBundle(dir.FullName, decryptor, manifest.GetAll())); } else if (files[0].Name.Equals(dir.Name)) { List <string> filenames = new List <string>(); string[] bundleNames = new string[0]; var bundle = AssetBundleArchive.Load(files[0].FullName); foreach (var archive in bundle.AssetArchives) { ObjectArchive oa = archive as ObjectArchive; if (oa == null) { continue; } foreach (var summary in oa.GetAllObjectInfo()) { if (summary.TypeID == TypeID.AssetBundleManifest) { Objects.AssetBundleManifest assetBundleManifest = summary.GetObject <Objects.AssetBundleManifest>(); bundleNames = assetBundleManifest.GetAllAssetBundles(); } } } foreach (string bundleName in bundleNames) { var fullName = System.IO.Path.Combine(dir.FullName, bundleName.Replace("/", @"\")); filenames.Add(fullName); } bundle.Dispose(); //UnityEngine.AssetBundle bundle = UnityEngine.AssetBundle.LoadFromFile(files[0].FullName); //AssetBundleManifest manifest = bundle.LoadAsset<AssetBundleManifest>("assetbundlemanifest"); //bundle.Unload(false); //files = new List<FileInfo>(); //foreach (string bundleName in manifest.GetAllAssetBundles()) //{ // var fullName = System.IO.Path.Combine(dir.FullName, bundleName.Replace("/", @"\")); // filenames.Add(fullName); //} return(container.LoadAssetBundle(filenames.ToArray())); } else { List <string> filenames = new List <string>(); foreach (FileInfo file in dir.GetFiles("*", SearchOption.AllDirectories)) { if (file.FullName.EndsWith(BundleSetting.ManifestFilename) || file.FullName.EndsWith(".manifest")) { continue; } filenames.Add(file.FullName); } return(container.LoadAssetBundle(filenames.ToArray())); } } catch (Exception e) { return(new ImmutableProgressResult <float>(e, 0f)); } }