diff --git a/osu.Game/Skinning/LegacyDatabasedSkinResourceStore.cs b/osu.Game/Skinning/LegacyDatabasedSkinResourceStore.cs index ab820a13ab..cd90fea9bb 100644 --- a/osu.Game/Skinning/LegacyDatabasedSkinResourceStore.cs +++ b/osu.Game/Skinning/LegacyDatabasedSkinResourceStore.cs @@ -1,25 +1,28 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; using System.Collections.Generic; -using System.Linq; using osu.Framework.Extensions; using osu.Framework.IO.Stores; -using osu.Game.Database; using osu.Game.Extensions; -using Realms; namespace osu.Game.Skinning { public class LegacyDatabasedSkinResourceStore : ResourceStore { - private readonly ILive source; + private readonly Dictionary fileToStoragePathMapping = new Dictionary(); public LegacyDatabasedSkinResourceStore(SkinInfo source, IResourceStore underlyingStore) : base(underlyingStore) { - this.source = source.ToLive(); + initialiseFileCache(source); + } + + private void initialiseFileCache(SkinInfo source) + { + fileToStoragePathMapping.Clear(); + foreach (var f in source.Files) + fileToStoragePathMapping[f.Filename.ToLowerInvariant()] = f.File.GetStoragePath(); } protected override IEnumerable GetFilenames(string name) @@ -33,17 +36,8 @@ namespace osu.Game.Skinning } private string getPathForFile(string filename) => - source.PerformRead(s => - { - if (s.IsManaged) - { - // avoid enumerating all files if this is a managed realm instance. - return s.Files.Filter(@"Filename ==[c] $0", filename).FirstOrDefault()?.File.GetStoragePath(); - } + fileToStoragePathMapping.TryGetValue(filename.ToLower(), out string path) ? path : null; - return s.Files.FirstOrDefault(f => string.Equals(f.Filename, filename, StringComparison.OrdinalIgnoreCase))?.File.GetStoragePath(); - }); - - public override IEnumerable GetAvailableResources() => source.PerformRead(s => s.Files.Select(f => f.Filename)); + public override IEnumerable GetAvailableResources() => fileToStoragePathMapping.Keys; } }