예제 #1
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);
        }
예제 #2
0
        static async ETTask <Sprite> __LoadAtlasImageAsyncInternal(this ImageLoaderComponent self, string asset_address, string subasset_name, Action <Sprite> callback = null)
        {
            var cacheCls = self.m_cacheSpriteAtlas;

            if (cacheCls.TryGet(asset_address, out var value_c))
            {
                if (value_c.asset == null)
                {
                    cacheCls.Remove(asset_address);
                }
                else
                {
                    value_c.ref_count = value_c.ref_count + 1;
                    if (value_c.subasset.TryGetValue(subasset_name, out var result))
                    {
                        value_c.subasset[subasset_name].ref_count = value_c.subasset[subasset_name].ref_count + 1;
                        callback?.Invoke(result.asset);
                        return(result.asset);
                    }
                    else
                    {
                        var sp = value_c.asset.GetSprite(subasset_name);
                        if (sp == null)
                        {
                            Log.Error("image not found:" + 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 = sp, ref_count = 1
                        };
                        callback?.Invoke(sp);
                        return(sp);
                    }
                }
            }
            var asset = await ResourcesComponent.Instance.LoadAsync <SpriteAtlas>(asset_address);

            if (asset != null)
            {
                if (cacheCls.TryGet(asset_address, out var value))
                {
                    value.ref_count = value.ref_count + 1;
                }
                else
                {
                    value = new SpriteAtlasValue()
                    {
                        asset = asset, ref_count = 1
                    };
                    cacheCls.Set(asset_address, value);
                }
                if (value.subasset.TryGetValue(subasset_name, out var result))
                {
                    value.subasset[subasset_name].ref_count = value.subasset[subasset_name].ref_count + 1;
                    callback?.Invoke(result.asset);
                    return(result.asset);
                }
                else
                {
                    var sp = value.asset.GetSprite(subasset_name);
                    if (sp == null)
                    {
                        Log.Error("image not found:" + subasset_name);
                        callback?.Invoke(null);
                        return(null);
                    }
                    if (value.subasset == null)
                    {
                        value.subasset = new Dictionary <string, SpriteValue>();
                    }
                    value.subasset[subasset_name] = new SpriteValue {
                        asset = sp, ref_count = 1
                    };
                    callback?.Invoke(sp);
                    return(sp);
                }
            }
            callback?.Invoke(null);
            return(null);
        }