示例#1
0
 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;
     });
 }
示例#2
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;
            });
        }
示例#3
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);
        }