public void Load(string url, int version, ResolveAction resolve, FallbackAction fallback) { CorgiDiskChunk chunk = null; if (chunkData.TryGetValue(url, out chunk)) { if (version >= 0 && chunk.version >= version) { chunkPriorityQueue.Remove(chunk.url); chunkPriorityQueue.AddFirst(chunk.url); corgi.StartCoroutine(DownloadLocal(chunk, resolve, fallback)); return; } else { chunkPriorityQueue.Remove(chunk.url); RemoveChunk(chunk); } } fallback(url, version, (bytes, tex) => { Save(bytes, url, version); resolve(bytes, tex); }); }
public void Save(byte[] bytes, string url, int version) { if (bytes == null || bytes.Length == 0) { return; } Debug.Log("Corgi Save " + url + " v." + version); //var bytes = tex.GetRawTextureData(); var path = Path.GetRandomFileName(); var size = bytes.Length; chunkData[url] = new CorgiDiskChunk() { url = url, version = version, path = path, size = size }; chunkPriorityQueue.AddFirst(url); useSize += size; SaveFile(path, bytes); while (capacity < useSize) { RemoveLastChunk(); } SaveCorgiDiskData(); }
IEnumerator DownloadLocal(CorgiDiskChunk chunk, ResolveAction resolve, FallbackAction fallback) { var realPath = Path.Combine(Application.temporaryCachePath, chunk.path); var www = new WWW("file:///" + realPath); Debug.Log("path=" + "file:///" + realPath); yield return(www); if (!string.IsNullOrEmpty(www.error)) { Debug.Log("[ERR]" + www.error + "\n" + chunk.url + " " + chunk.path); RemoveChunk(chunk); fallback(chunk.url, chunk.version, (bytes, tex) => { Save(bytes, chunk.url, chunk.version); resolve(bytes, tex); }); } else { Debug.Log("Disk hit"); Texture2D tex = new Texture2D(0, 0); www.LoadImageIntoTexture(tex); resolve(null, tex); } }
public void Load(string url, int version, ResolveAction resolve, FallbackAction fallback) { CorgiDiskChunk chunk = null; if (map.TryGetValue(url, out chunk)) { if (chunk.version >= version) { queue.Remove(chunk.url); queue.AddFirst(chunk.url); StartCoroutine(DownloadLocal(chunk, resolve, fallback)); return; } else { queue.Remove(chunk.url); RemoveChunk(chunk); } } ResolveAction newResolve = (tex) => { Save(tex, url, version); resolve(tex); }; fallback(url, version, newResolve); }
private void RemoveChunk(CorgiDiskChunk chunk) { Debug.Log("Remove Chunk" + chunk.url); var realPath = Path.Combine(Application.temporaryCachePath, chunk.path); useSize -= chunk.size; chunkData.Remove(chunk.url); var t = new System.Threading.Thread(() => { if (File.Exists(realPath)) { File.Delete(realPath); } }); t.Start(); }
public void Save(Texture2D tex, string url, int version) { var bytes = tex.GetRawTextureData(); var path = Path.GetRandomFileName(); var size = bytes.Length; map[url] = new CorgiDiskChunk() { url = url, version = version, path = path, size = size }; queue.AddFirst(url); useSize += size; SaveFile(path, bytes); while (capacity < useSize) { RemoveLastChunk(); } }