mirror of
https://github.com/osukey/osukey.git
synced 2025-07-02 16:59:53 +09:00
Add basic background processor
This commit is contained in:
112
osu.Game/BackgroundBeatmapProcessor.cs
Normal file
112
osu.Game/BackgroundBeatmapProcessor.cs
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. 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.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Logging;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Database;
|
||||||
|
using osu.Game.Rulesets;
|
||||||
|
|
||||||
|
namespace osu.Game
|
||||||
|
{
|
||||||
|
public class BackgroundBeatmapProcessor : Component
|
||||||
|
{
|
||||||
|
[Resolved]
|
||||||
|
private RulesetStore rulesetStore { get; set; } = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private RealmAccess realmAccess { get; set; } = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private BeatmapUpdater beatmapUpdater { get; set; } = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private IBindable<WorkingBeatmap> gameBeatmap { get; set; } = null!;
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
|
||||||
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
Logger.Log("Beginning background beatmap processing..");
|
||||||
|
checkForOutdatedStarRatings();
|
||||||
|
processBeatmapSetsWithMissingMetrics();
|
||||||
|
Logger.Log("Finished background beatmap processing!");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check whether the databased difficulty calculation version matches the latest ruleset provided version.
|
||||||
|
/// If it doesn't, clear out any existing difficulties so they can be incrementally recalculated.
|
||||||
|
/// </summary>
|
||||||
|
private void checkForOutdatedStarRatings()
|
||||||
|
{
|
||||||
|
foreach (var ruleset in rulesetStore.AvailableRulesets)
|
||||||
|
{
|
||||||
|
// beatmap being passed in is arbitrary here. just needs to be non-null.
|
||||||
|
int currentVersion = ruleset.CreateInstance().CreateDifficultyCalculator(gameBeatmap.Value).Version;
|
||||||
|
|
||||||
|
if (ruleset.LastAppliedDifficultyVersion < currentVersion)
|
||||||
|
{
|
||||||
|
Logger.Log($"Resetting star ratings for {ruleset.Name} (difficulty calculation version updated from {ruleset.LastAppliedDifficultyVersion} to {currentVersion})");
|
||||||
|
|
||||||
|
int countReset = 0;
|
||||||
|
|
||||||
|
realmAccess.Write(r =>
|
||||||
|
{
|
||||||
|
foreach (var b in r.All<BeatmapInfo>())
|
||||||
|
{
|
||||||
|
if (b.Ruleset.ShortName == ruleset.ShortName)
|
||||||
|
{
|
||||||
|
b.StarRating = 0;
|
||||||
|
countReset++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Find<RulesetInfo>(ruleset.ShortName).LastAppliedDifficultyVersion = currentVersion;
|
||||||
|
});
|
||||||
|
|
||||||
|
Logger.Log($"Finished resetting {countReset} beatmap sets for {ruleset.Name}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processBeatmapSetsWithMissingMetrics()
|
||||||
|
{
|
||||||
|
// TODO: rate limit and pause processing during gameplay.
|
||||||
|
|
||||||
|
HashSet<Guid> beatmapSetIds = new HashSet<Guid>();
|
||||||
|
|
||||||
|
realmAccess.Run(r =>
|
||||||
|
{
|
||||||
|
foreach (var b in r.All<BeatmapInfo>().Where(b => b.StarRating == 0 || (b.OnlineID > 0 && b.LastOnlineUpdate == null)))
|
||||||
|
{
|
||||||
|
Debug.Assert(b.BeatmapSet != null);
|
||||||
|
beatmapSetIds.Add(b.BeatmapSet.ID);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
foreach (var id in beatmapSetIds)
|
||||||
|
{
|
||||||
|
realmAccess.Run(r =>
|
||||||
|
{
|
||||||
|
var set = r.Find<BeatmapSetInfo>(id);
|
||||||
|
|
||||||
|
if (set != null)
|
||||||
|
{
|
||||||
|
Logger.Log($"Background processing {set}");
|
||||||
|
beatmapUpdater.Process(set);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -904,6 +904,8 @@ namespace osu.Game
|
|||||||
|
|
||||||
loadComponentSingleFile(CreateHighPerformanceSession(), Add);
|
loadComponentSingleFile(CreateHighPerformanceSession(), Add);
|
||||||
|
|
||||||
|
loadComponentSingleFile(new BackgroundBeatmapProcessor(), Add);
|
||||||
|
|
||||||
chatOverlay.State.BindValueChanged(_ => updateChatPollRate());
|
chatOverlay.State.BindValueChanged(_ => updateChatPollRate());
|
||||||
// Multiplayer modes need to increase poll rate temporarily.
|
// Multiplayer modes need to increase poll rate temporarily.
|
||||||
API.Activity.BindValueChanged(_ => updateChatPollRate(), true);
|
API.Activity.BindValueChanged(_ => updateChatPollRate(), true);
|
||||||
|
@ -280,8 +280,7 @@ namespace osu.Game
|
|||||||
AddInternal(difficultyCache);
|
AddInternal(difficultyCache);
|
||||||
|
|
||||||
// TODO: OsuGame or OsuGameBase?
|
// TODO: OsuGame or OsuGameBase?
|
||||||
beatmapUpdater = new BeatmapUpdater(BeatmapManager, difficultyCache, API, Storage);
|
dependencies.CacheAs(beatmapUpdater = new BeatmapUpdater(BeatmapManager, difficultyCache, API, Storage));
|
||||||
|
|
||||||
dependencies.CacheAs(spectatorClient = new OnlineSpectatorClient(endpoints));
|
dependencies.CacheAs(spectatorClient = new OnlineSpectatorClient(endpoints));
|
||||||
dependencies.CacheAs(multiplayerClient = new OnlineMultiplayerClient(endpoints));
|
dependencies.CacheAs(multiplayerClient = new OnlineMultiplayerClient(endpoints));
|
||||||
dependencies.CacheAs(metadataClient = new OnlineMetadataClient(endpoints));
|
dependencies.CacheAs(metadataClient = new OnlineMetadataClient(endpoints));
|
||||||
|
Reference in New Issue
Block a user