Пример #1
0
 public override void Get(string location, Texture2DCompression compression, Picture instance, Action <Sprite> onSuccess, Action <Exception> onFailure)
 {
     Downloader.Download(location, result => {
         if (compression != Texture2DCompression.None)
         {
             result.Compress(compression == Texture2DCompression.HighQuality);
         }
     }, onFailure);
 }
Пример #2
0
        public override UniTask Free(string location, Texture2DCompression compression, Picture instance)
        {
            var source = new UniTaskCompletionSource <bool>();

            Free(location, compression, instance,
                 () => source.TrySetResult(true),
                 exception => source.TrySetException(exception)
                 );
            return(source.Task);
        }
Пример #3
0
        public override UniTask <Sprite> Get(string location, Texture2DCompression compression, Picture instance)
        {
            var source = new UniTaskCompletionSource <Sprite>();

            Get(location, compression, instance,
                result => source.TrySetResult(result),
                exception => source.TrySetException(exception)
                );
            return(source.Task);
        }
Пример #4
0
        public void Refresh()
        {
            if (!Application.isPlaying)
            {
                return;
            }

            if (currentVisibility == Visibility.None && !updateWhenOffScreen)
            {
                return;
            }

            if (compression == oldCompression && path == oldPath)
            {
                return;
            }

            try {
                Cache.Free(oldPath, oldCompression, this);
                onLoadStart.Invoke();
                Cache.Get(
                    path, compression, this,
                    result => {
                    if (sprite == null || sprite.texture == null)
                    {
                        SetSprite(result);
                        onLoadSuccess.Invoke();
                        return;
                    }
                    if (sprite != null && sprite.texture != null && result.texture != sprite.texture)
                    {
                        SetSprite(result);
                        onLoadSuccess.Invoke();
                    }
                },
                    error => {
                    Debug.LogError($"Dynamic Image Refresh from remote path failed: " + error);
                    onLoadFailure.Invoke();
                }
                    );
            }
            catch (Exception e) {
                Debug.LogError(e);
            }
            oldPath        = path;
            oldCompression = compression;
        }
Пример #5
0
        public override void Free(string location, Texture2DCompression compression, Picture instance, Action onSuccess, Action <Exception> onFailure)
        {
            if (string.IsNullOrEmpty(location))
            {
                return;
            }

            try {
                var k = new Key(location, compression);

                for (int i = 0; i < instances.Keys.Count; i++)
                {
                    var key = instances.Keys.ToList()[i];

                    if (key.Equals(k))
                    {
                        instances[key].Remove(instance);

                        if (instances[key].Count <= 0)
                        {
                            freed.EnsureContains(key);

                            var unusedKeys = instances.Where(x => x.Value.Count <= 0).Select(x => x.Key).ToList();
                            while (resources.Count > maxResourceCount && unusedKeys.Count > 0)
                            {
                                var oldestFreed = freed[0];
                                instances[oldestFreed].Clear();
                                instances.Remove(oldestFreed);

                                MonoBehaviour.Destroy(resources[oldestFreed]);
                                resources.Remove(oldestFreed);
                                freed.EnsureDoesntContain(oldestFreed);
                            }
                        }
                    }
                }
                onSuccess?.Invoke();
            }
            catch (Exception e) {
                onFailure?.Invoke(e);
            }
        }
Пример #6
0
 public abstract UniTask <Sprite> Get(string location, Texture2DCompression compression, Picture instance);
Пример #7
0
 public abstract void Get(string location, Texture2DCompression compression, Picture instance, Action <Sprite> onSuccess, Action <Exception> onFailure);
Пример #8
0
 public abstract UniTask Free(string location, Texture2DCompression compression, Picture instance);
Пример #9
0
        public override void Get(string location, Texture2DCompression compression, Picture instance, Action <Sprite> onSuccess, Action <Exception> onFailure)
        {
            if (string.IsNullOrEmpty(location))
            {
                onFailure?.Invoke(new ArgumentException("location cannot be null or empty", "location"));
                return;
            }
            var key = new Key(location, compression);

            if (resources.Keys.Contains(key))
            {
                freed.EnsureDoesntContain(key);
                instances[key].EnsureContains(instance);

                onSuccess?.Invoke(resources[key]);
                return;
            }

            var request = new Request(onSuccess, onFailure);

            requests.EnsureKey(key, new List <Request>()
            {
            });
            requests[key].Add(request);
            if (requests[key].Count > 1)
            {
                return;
            }

            Downloader.Download(location,
                                result => {
                if (compression != Texture2DCompression.None)
                {
                    result.Compress(compression == Texture2DCompression.HighQuality);
                }
                var resultSprite = result.ToSprite();

                freed.EnsureDoesntContain(key);
                resources.EnsureKey(key, resultSprite);
                instances.EnsureKey(key, new List <Picture>());
                instances[key].Add(instance);

                foreach (var req in requests[key])
                {
                    req.onSuccess?.Invoke(resultSprite);
                }

                requests[key].Clear();
                requests.Remove(key);

                if (instance != null)
                {
                    onSuccess?.Invoke(resultSprite);
                }
            },
                                error => {
                requests[key].ForEach(x => x.onFailure?.Invoke(error));
                requests[key].Clear();
                requests.Remove(key);

                if (instance != null)
                {
                    onFailure?.Invoke(error);
                }
            }
                                );
        }
Пример #10
0
 public Key(string path, Texture2DCompression compression)
 {
     this.path        = path;
     this.compression = compression;
 }
Пример #11
0
 public override UniTask Free(string location, Texture2DCompression compression, Picture instance)
 {
     return(UniTask.CompletedTask);
 }
Пример #12
0
 public override void Free(string location, Texture2DCompression compression, Picture instance, Action onSuccess, Action <Exception> onFailure)
 {
     // DynamicImageFaceCache does not free instances as it never stores them in the first place
 }