Esempio n. 1
0
        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);
                }
            }));
        }
Esempio n. 2
0
 public PreloadData(ObjectArchive archive)
 {
     this.Archive = archive;
 }
Esempio n. 3
0
 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));
            }
        }