Esempio n. 1
0
        static void WriteCache(string file, CACHE cache)
        {
            string dir = Path.GetDirectoryName(file);

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }

            using (FileStream fs = File.OpenWrite(file))
            {
                BinaryWriter bw  = new BinaryWriter(fs);
                byte[]       buf = new byte[16];
                {
                    IntPtr ptr = Marshal.AllocHGlobal(16);
                    Marshal.StructureToPtr(cache.dependencyHash, ptr, false);
                    Marshal.Copy(ptr, buf, 0, 16);
                    Marshal.FreeHGlobal(ptr);
                }
                bw.Write(buf);
                bw.Write((ushort)cache.depends.Length);
                foreach (var dep in cache.depends)
                {
                    bw.Write(dep);
                }
            }
        }
Esempio n. 2
0
        static CACHE ReadCache(string file)
        {
            if (!File.Exists(file))
            {
                return(null);
            }

            using (FileStream fs = File.OpenRead(file))
            {
                CACHE        cache = new CACHE();
                BinaryReader br    = new BinaryReader(fs);
                uint         i0    = br.ReadUInt32();
                uint         i1    = br.ReadUInt32();
                uint         i2    = br.ReadUInt32();
                uint         i3    = br.ReadUInt32();
                cache.dependencyHash = new Hash128(i0, i1, i2, i3);
                ushort size = br.ReadUInt16();
                cache.depends = new string[size];
                for (int i = 0; i < size; ++i)
                {
                    cache.depends[i] = br.ReadString();
                }
                return(cache);
            }
        }
Esempio n. 3
0
        static CACHE FetchDependCache(string pathName, bool recursive)
        {
            CACHE   cache   = null;
            Hash128 depHash = AssetDatabase.GetAssetDependencyHash(pathName);

            //memory
            if (cacheInMemory.TryGetValue(depHash, out cache) && cache.dependencyHash == depHash)
            {
                return(cache);
            }
            else
            {
                cache = null;
            }

            //disk
            string cacheFile = CalcCacheFileName(depHash);

            cache = ReadCache(cacheFile);
            if (cache != null && cache.dependencyHash == depHash)
            {
                cacheInMemory[depHash] = cache;
                return(cache);
            }
            else
            {
                cache = null;
            }

            //rebuild
            if (cache == null)
            {
                cache = new CACHE();
                cache.dependencyHash = depHash;
                cache.depends        = AssetDatabase.GetDependencies(pathName, false);
                WriteCache(cacheFile, cache);
                cacheInMemory[depHash] = cache;

                if (recursive)
                {
                    foreach (var dep in AssetDatabase.GetDependencies(pathName, true))
                    {
                        if (dep == pathName)
                        {
                            continue;
                        }
                        FetchDependCache(dep, false);
                    }
                }
            }
            return(cache);
        }