diff --git a/SpineViewer/src/SpinePreviewer.Designer.cs b/SpineViewer/src/SpinePreviewer.Designer.cs index 9ab944d..9a80372 100644 --- a/SpineViewer/src/SpinePreviewer.Designer.cs +++ b/SpineViewer/src/SpinePreviewer.Designer.cs @@ -29,7 +29,6 @@ private void InitializeComponent() { panel = new Panel(); - backgroundWorker = new System.ComponentModel.BackgroundWorker(); SuspendLayout(); // // panel @@ -45,11 +44,6 @@ panel.MouseUp += panel_MouseUp; panel.MouseWheel += panel_MouseWheel; // - // backgroundWorker - // - backgroundWorker.WorkerSupportsCancellation = true; - backgroundWorker.DoWork += backgroundWorker_DoWork; - // // SpinePreviewer // AutoScaleDimensions = new SizeF(11F, 24F); @@ -65,6 +59,5 @@ #endregion private Panel panel; - private System.ComponentModel.BackgroundWorker backgroundWorker; } } diff --git a/SpineViewer/src/SpinePreviewer.cs b/SpineViewer/src/SpinePreviewer.cs index 5687da7..c4f8ac4 100644 --- a/SpineViewer/src/SpinePreviewer.cs +++ b/SpineViewer/src/SpinePreviewer.cs @@ -84,7 +84,7 @@ namespace SpineViewer private static readonly SFML.Graphics.Color AxisColor = SFML.Graphics.Color.Red; private readonly SFML.Graphics.RectangleShape BackgroundCell = new() { FillColor = new(220, 220, 220) }; - private readonly SFML.Graphics.VertexArray XAxisVertex = new (SFML.Graphics.PrimitiveType.Lines, 2); + private readonly SFML.Graphics.VertexArray XAxisVertex = new(SFML.Graphics.PrimitiveType.Lines, 2); private readonly SFML.Graphics.VertexArray YAxisVertex = new(SFML.Graphics.PrimitiveType.Lines, 2); private readonly SFML.Graphics.RenderWindow RenderWindow; @@ -92,25 +92,8 @@ namespace SpineViewer private SFML.System.Vector2f? draggingSrc = null; private Spine.Spine? draggingSpine = null; - /// - /// 安全获取 Spine 列表 - /// - private Spine.Spine[] Spines - { - get - { - if (SpineListView is null) - return []; - - // 需要在控件线程拿到数组浅拷贝副本 - Spine.Spine[] spines = null; - if (SpineListView.InvokeRequired) - SpineListView.Invoke(() => spines = SpineListView.Spines.ToArray()); - else - spines = SpineListView.Spines.ToArray(); - return spines; - } - } + private Task? task = null; + private CancellationTokenSource? cancelToken = null; public SpinePreviewer() { @@ -273,8 +256,10 @@ namespace SpineViewer /// public void StartPreview() { - if (!backgroundWorker.IsBusy) - backgroundWorker.RunWorkerAsync(); + if (task is not null) + return; + cancelToken = new(); + task = Task.Run(RenderTask, cancelToken.Token); } /// @@ -282,8 +267,12 @@ namespace SpineViewer /// public void StopPreview() { - if (backgroundWorker.IsBusy) - backgroundWorker.CancelAsync(); + if (task is null || cancelToken is null) + return; + cancelToken.Cancel(); + task.Wait(); + cancelToken = null; + task = null; } private void SpinePreviewer_SizeChanged(object sender, EventArgs e) @@ -328,12 +317,16 @@ namespace SpineViewer { draggingSrc = RenderWindow.MapPixelToCoords(new(e.X, e.Y)); var src = new PointF(((SFML.System.Vector2f)draggingSrc).X, ((SFML.System.Vector2f)draggingSrc).Y); - foreach (var spine in Spines) + + if (SpineListView is not null) { - if (spine.Bounds.Contains(src)) + foreach (var spine in SpineListView.Spines) { - draggingSpine = spine; - break; + if (spine.Bounds.Contains(src)) + { + draggingSpine = spine; + break; + } } } } @@ -434,35 +427,42 @@ namespace SpineViewer } } - private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) + private void RenderTask() { - RenderWindow.SetActive(true); - float delta; - - while (!backgroundWorker.CancellationPending) + try { - delta = Clock.ElapsedTime.AsSeconds(); - Clock.Restart(); + RenderWindow.SetActive(true); - RenderWindow.Clear(BackgroundColor); - - // 渲染背景网格 - DrawBackground(); - - - // 渲染 Spine - foreach (var spine in Spines.Reverse()) + float delta; + while (cancelToken is not null && !cancelToken.IsCancellationRequested) { - spine.Update(delta); - RenderWindow.Draw(spine); + delta = Clock.ElapsedTime.AsSeconds(); + Clock.Restart(); + + RenderWindow.Clear(BackgroundColor); + + // 渲染背景网格 + DrawBackground(); + + // 渲染 Spine + if (SpineListView is not null) + { + foreach (var spine in SpineListView.Spines.Reverse()) + { + spine.Update(delta); + RenderWindow.Draw(spine); + // TODO: 渲染包围盒 + } + } + + RenderWindow.Display(); } - - RenderWindow.Display(); } - - RenderWindow.SetActive(false); + finally + { + RenderWindow.SetActive(false); + } } - } } diff --git a/SpineViewer/src/SpinePreviewer.resx b/SpineViewer/src/SpinePreviewer.resx index 60ff075..8b2ff64 100644 --- a/SpineViewer/src/SpinePreviewer.resx +++ b/SpineViewer/src/SpinePreviewer.resx @@ -117,7 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 - \ No newline at end of file