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); }
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); }
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); }
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; }
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); } }
public abstract UniTask <Sprite> Get(string location, Texture2DCompression compression, Picture instance);
public abstract void Get(string location, Texture2DCompression compression, Picture instance, Action <Sprite> onSuccess, Action <Exception> onFailure);
public abstract UniTask Free(string location, Texture2DCompression compression, Picture instance);
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); } } ); }
public Key(string path, Texture2DCompression compression) { this.path = path; this.compression = compression; }
public override UniTask Free(string location, Texture2DCompression compression, Picture instance) { return(UniTask.CompletedTask); }
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 }