static void InitSingleSpriteCache(this ImageLoaderComponent self, LruCache <string, SpriteValue> cache) { cache.SetCheckCanPopCallback((string key, SpriteValue value) => { return(value.ref_count == 0); }); cache.SetPopCallback((key, value) => { ResourcesComponent.Instance.ReleaseAsset(value.asset); value.asset = null; value.ref_count = 0; }); }
static void InitSpriteAtlasCache(this ImageLoaderComponent self, LruCache <string, SpriteAtlasValue> cache) { cache.SetCheckCanPopCallback((string key, SpriteAtlasValue value) => { return(value.ref_count == 0); }); cache.SetPopCallback((key, value) => { var subasset = value.subasset; foreach (var item in subasset) { UnityEngine.Object.Destroy(item.Value.asset); item.Value.asset = null; item.Value.ref_count = 0; } ResourcesComponent.Instance.ReleaseAsset(value.asset); value.asset = null; value.ref_count = 0; }); }
static async ETTask <Sprite> __LoadSpriteImageAsyncInternal(this ImageLoaderComponent self, string asset_address, string subasset_name, Action <Sprite> callback) { LruCache <string, SpriteAtlasValue> cacheCls = self.m_cacheSpriteAtlas; var cached = false; if (cacheCls.TryGet(asset_address, out SpriteAtlasValue value_c)) { if (value_c.asset == null) { cacheCls.Remove(asset_address); } else { cached = true; Sprite result; var subasset_list = value_c.subasset; if (subasset_list.ContainsKey(subasset_name)) { result = subasset_list[subasset_name].asset; subasset_list[subasset_name].ref_count = subasset_list[subasset_name].ref_count + 1; value_c.ref_count++; } else { result = value_c.asset.GetSprite(subasset_name); if (result == null) { Log.Error("image not found:" + asset_address + "__" + subasset_name); callback?.Invoke(null); return(null); } if (value_c.subasset == null) { value_c.subasset = new Dictionary <string, SpriteValue>(); } value_c.subasset[subasset_name] = new SpriteValue { asset = result, ref_count = 1 }; value_c.ref_count++; } callback?.Invoke(result); return(result); } } if (!cached) { var asset = await ResourcesComponent.Instance.LoadAsync <SpriteAtlas>(asset_address); if (asset != null) { Sprite result; var sa = asset; if (cacheCls.TryGet(asset_address, out value_c)) { var subasset_list = value_c.subasset; if (subasset_list.ContainsKey(subasset_name)) { result = subasset_list[subasset_name].asset; subasset_list[subasset_name].ref_count = subasset_list[subasset_name].ref_count + 1; } else { result = value_c.asset.GetSprite(subasset_name); if (result == null) { Log.Error("image not found:" + asset_address + "__" + subasset_name); callback?.Invoke(null); return(null); } if (value_c.subasset == null) { value_c.subasset = new Dictionary <string, SpriteValue>(); } value_c.subasset[subasset_name] = new SpriteValue { asset = result, ref_count = 1 }; } } else { value_c = new SpriteAtlasValue { asset = sa, subasset = new Dictionary <string, SpriteValue>(), ref_count = 1 }; result = value_c.asset.GetSprite(subasset_name); if (result == null) { Log.Error("image not found:" + asset_address + "__" + subasset_name); callback?.Invoke(null); return(null); } if (value_c.subasset == null) { value_c.subasset = new Dictionary <string, SpriteValue>(); } value_c.subasset[subasset_name] = new SpriteValue { asset = result, ref_count = 1 }; cacheCls.Set(asset_address, value_c); } callback?.Invoke(result); return(result); } else { callback?.Invoke(null); return(null); } } callback?.Invoke(null); return(null); }