diff --git a/BetterGenshinImpact/GameTask/AutoPathing/Navigation.cs b/BetterGenshinImpact/GameTask/AutoPathing/Navigation.cs index 7a1fa5f3..e0f749b2 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/Navigation.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/Navigation.cs @@ -1,16 +1,21 @@ using BetterGenshinImpact.GameTask.AutoPathing.Model; using BetterGenshinImpact.GameTask.Common.Map; -using BetterGenshinImpact.GameTask.Common; +using BetterGenshinImpact.GameTask.Model.Area; using OpenCvSharp; using System; -using System.Collections.Generic; -using System.Text; -using BetterGenshinImpact.GameTask.Model.Area; - +using BetterGenshinImpact.GameTask.Common; +using Microsoft.Extensions.Logging; namespace BetterGenshinImpact.GameTask.AutoPathing; + internal class Navigation { + public static void WarmUp() + { + TaskControl.Logger.LogInformation("地图特征点加载中,由于体积较大,可能加载速度较慢或引发卡顿,请耐心等待..."); + EntireMap.Instance.GetFeatureMatcher(); + TaskControl.Logger.LogInformation("地图特征点完成!"); + } internal static Point2f GetPosition(ImageRegion imageRegion) { @@ -45,4 +50,4 @@ internal class Navigation var y2 = position.Y; return Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); } -} \ No newline at end of file +} diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index 2854dbc2..dead4f60 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -24,17 +24,6 @@ public class PathExecutor(CancellationTokenSource cts) { public async Task Pathing(PathingTask task) { - if (!TaskContext.Instance().IsInitialized) - { - UIDispatcherHelper.Invoke(()=> - { - Toast.Warning("请先在启动页,启动截图器再使用本功能"); - }); - return; - } - - SystemControl.ActivateWindow(); - if (task.Positions.Count == 0) { Logger.LogWarning("没有路径点,寻路结束"); @@ -64,6 +53,9 @@ public class PathExecutor(CancellationTokenSource cts) waypoints.Add(waypointCopy); } + await Delay(100, cts); + Navigation.WarmUp(); // 提前加载地图特征点 + foreach (var waypoint in waypoints) { if (waypoint.Type == WaypointType.Teleport.Code) diff --git a/BetterGenshinImpact/GameTask/Common/Map/EntireMap.cs b/BetterGenshinImpact/GameTask/Common/Map/EntireMap.cs index 530e8967..654b01c2 100644 --- a/BetterGenshinImpact/GameTask/Common/Map/EntireMap.cs +++ b/BetterGenshinImpact/GameTask/Common/Map/EntireMap.cs @@ -26,6 +26,11 @@ public class EntireMap : Singleton _featureMatcher = new FeatureMatcher(new Size(28672, 26624), new FeatureStorage("mainMap2048Block")); } + public FeatureMatcher GetFeatureMatcher() + { + return _featureMatcher; + } + private int _failCnt = 0; /// diff --git a/BetterGenshinImpact/GameTask/TaskRunner.cs b/BetterGenshinImpact/GameTask/TaskRunner.cs index 5893def2..a26bde5f 100644 --- a/BetterGenshinImpact/GameTask/TaskRunner.cs +++ b/BetterGenshinImpact/GameTask/TaskRunner.cs @@ -7,6 +7,8 @@ using Microsoft.Extensions.Logging; using System; using System.Threading; using System.Threading.Tasks; +using BetterGenshinImpact.Helpers; +using Wpf.Ui.Violeta.Controls; using static BetterGenshinImpact.GameTask.Common.TaskControl; namespace BetterGenshinImpact.GameTask; @@ -94,6 +96,12 @@ public class TaskRunner public void Init() { + if (!TaskContext.Instance().IsInitialized) + { + UIDispatcherHelper.Invoke(() => { Toast.Warning("请先在启动页,启动截图器再使用本功能"); }); + throw new NormalEndException("请先在启动页,启动截图器再使用本功能"); + } + // 激活原神窗口 var maskWindow = MaskWindow.Instance(); SystemControl.ActivateWindow(); @@ -123,6 +131,11 @@ public class TaskRunner public void End() { + if (!TaskContext.Instance().IsInitialized) + { + return; + } + VisionContext.Instance().DrawContent.ClearAll(); if (_timerOperation == DispatcherTimerOperationEnum.UseSelfCaptureImage) { diff --git a/BetterGenshinImpact/ViewModel/Pages/MapPathingViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/MapPathingViewModel.cs index 32960588..e2308376 100644 --- a/BetterGenshinImpact/ViewModel/Pages/MapPathingViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/MapPathingViewModel.cs @@ -94,7 +94,7 @@ public partial class MapPathingViewModel : ObservableObject, INavigationAware, I { return; } - await new TaskRunner(DispatcherTimerOperationEnum.UseSelfCaptureImage) - .RunAsync(async () => await new PathExecutor(CancellationContext.Instance.Cts).Pathing(item)); + new TaskRunner(DispatcherTimerOperationEnum.UseSelfCaptureImage) + .FireAndForget(async () => await new PathExecutor(CancellationContext.Instance.Cts).Pathing(item)); } }