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); } } }
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); } }
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); }