mirror of
https://github.com/ppy/osu.git
synced 2025-02-22 01:23:24 +08:00
Use a global ruleset config cache
This commit is contained in:
parent
be01dbae3a
commit
14b7530994
@ -56,6 +56,8 @@ namespace osu.Game
|
|||||||
|
|
||||||
protected SettingsStore SettingsStore;
|
protected SettingsStore SettingsStore;
|
||||||
|
|
||||||
|
protected RulesetConfigCache RulesetConfigCache;
|
||||||
|
|
||||||
protected MenuCursorContainer MenuCursorContainer;
|
protected MenuCursorContainer MenuCursorContainer;
|
||||||
|
|
||||||
private Container content;
|
private Container content;
|
||||||
@ -123,6 +125,7 @@ namespace osu.Game
|
|||||||
dependencies.Cache(ScoreStore = new ScoreStore(Host.Storage, contextFactory, Host, BeatmapManager, RulesetStore));
|
dependencies.Cache(ScoreStore = new ScoreStore(Host.Storage, contextFactory, Host, BeatmapManager, RulesetStore));
|
||||||
dependencies.Cache(KeyBindingStore = new KeyBindingStore(contextFactory, RulesetStore));
|
dependencies.Cache(KeyBindingStore = new KeyBindingStore(contextFactory, RulesetStore));
|
||||||
dependencies.Cache(SettingsStore = new SettingsStore(contextFactory));
|
dependencies.Cache(SettingsStore = new SettingsStore(contextFactory));
|
||||||
|
dependencies.Cache(RulesetConfigCache = new RulesetConfigCache(SettingsStore));
|
||||||
dependencies.Cache(new OsuColour());
|
dependencies.Cache(new OsuColour());
|
||||||
|
|
||||||
fileImporters.Add(BeatmapManager);
|
fileImporters.Add(BeatmapManager);
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Game.Configuration;
|
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Settings
|
namespace osu.Game.Overlays.Settings
|
||||||
@ -26,7 +25,7 @@ namespace osu.Game.Overlays.Settings
|
|||||||
{
|
{
|
||||||
dependencies = new DependencyContainer(base.CreateLocalDependencies(parent));
|
dependencies = new DependencyContainer(base.CreateLocalDependencies(parent));
|
||||||
|
|
||||||
var config = ruleset.CreateConfig(dependencies.Get<SettingsStore>());
|
var config = dependencies.Get<RulesetConfigCache>().GetConfigFor(ruleset);
|
||||||
if (config != null)
|
if (config != null)
|
||||||
dependencies.Cache(config);
|
dependencies.Cache(config);
|
||||||
|
|
||||||
|
43
osu.Game/Rulesets/RulesetConfigCache.cs
Normal file
43
osu.Game/Rulesets/RulesetConfigCache.cs
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Game.Configuration;
|
||||||
|
using osu.Game.Rulesets.Configuration;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A cache that provides a single <see cref="IRulesetConfigManager"/> per-ruleset
|
||||||
|
/// This is done to support referring to and updating ruleset configs from multiple locations in the absence of inter-config bindings.
|
||||||
|
/// </summary>
|
||||||
|
public class RulesetConfigCache : Component
|
||||||
|
{
|
||||||
|
private readonly Dictionary<int, IRulesetConfigManager> configCache = new Dictionary<int, IRulesetConfigManager>();
|
||||||
|
private readonly SettingsStore settingsStore;
|
||||||
|
|
||||||
|
public RulesetConfigCache(SettingsStore settingsStore)
|
||||||
|
{
|
||||||
|
this.settingsStore = settingsStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves the <see cref="IRulesetConfigManager"/> for a <see cref="Ruleset"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ruleset">The <see cref="Ruleset"/> to retrieve the <see cref="IRulesetConfigManager"/> for.</param>
|
||||||
|
/// <returns>The <see cref="IRulesetConfigManager"/> defined by <paramref name="ruleset"/>, null if <paramref name="ruleset"/> doesn't define one.</returns>
|
||||||
|
/// <exception cref="InvalidOperationException">If <paramref name="ruleset"/> doesn't have a valid <see cref="RulesetInfo.ID"/>.</exception>
|
||||||
|
public IRulesetConfigManager GetConfigFor(Ruleset ruleset)
|
||||||
|
{
|
||||||
|
if (ruleset.RulesetInfo.ID == null)
|
||||||
|
throw new InvalidOperationException("The provided ruleset doesn't have a valid id.");
|
||||||
|
|
||||||
|
if (configCache.TryGetValue(ruleset.RulesetInfo.ID.Value, out var existing))
|
||||||
|
return existing;
|
||||||
|
|
||||||
|
return configCache[ruleset.RulesetInfo.ID.Value] = ruleset.CreateConfig(settingsStore);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -91,16 +91,11 @@ namespace osu.Game.Rulesets.UI
|
|||||||
|
|
||||||
onScreenDisplay = dependencies.Get<OnScreenDisplay>();
|
onScreenDisplay = dependencies.Get<OnScreenDisplay>();
|
||||||
|
|
||||||
var settings = dependencies.Get<SettingsStore>();
|
rulesetConfig = dependencies.Get<RulesetConfigCache>().GetConfigFor(Ruleset);
|
||||||
if (settings != null)
|
if (rulesetConfig != null)
|
||||||
{
|
{
|
||||||
rulesetConfig = Ruleset.CreateConfig(settings);
|
dependencies.Cache(rulesetConfig);
|
||||||
|
onScreenDisplay?.BeginTracking(this, rulesetConfig);
|
||||||
if (rulesetConfig != null)
|
|
||||||
{
|
|
||||||
dependencies.Cache(rulesetConfig);
|
|
||||||
onScreenDisplay?.BeginTracking(this, rulesetConfig);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return dependencies;
|
return dependencies;
|
||||||
|
Loading…
Reference in New Issue
Block a user