拆分双渲染线程

This commit is contained in:
ww-rm
2025-11-08 17:34:20 +08:00
parent 763d2e295e
commit 849f1813be

View File

@@ -61,6 +61,7 @@ namespace SpineViewer.ViewModels.MainWindow
/// 渲染任务 /// 渲染任务
/// </summary> /// </summary>
private Task? _renderTask = null; private Task? _renderTask = null;
private Task? _wallpaperRenderTask = null;
private CancellationTokenSource? _cancelToken = null; private CancellationTokenSource? _cancelToken = null;
/// <summary> /// <summary>
@@ -459,26 +460,29 @@ namespace SpineViewer.ViewModels.MainWindow
{ {
if (_renderTask is not null) return; if (_renderTask is not null) return;
_cancelToken = new(); _cancelToken = new();
_renderTask = new Task(RenderTask, _cancelToken.Token, TaskCreationOptions.LongRunning); _renderTask = new(RenderTask, _cancelToken.Token, TaskCreationOptions.LongRunning);
_wallpaperRenderTask = new(WallpaperRenderTask, _cancelToken.Token, TaskCreationOptions.LongRunning);
_renderTask.Start(); _renderTask.Start();
_wallpaperRenderTask.Start();
IsUpdating = true; IsUpdating = true;
} }
public void StopRender() public void StopRender()
{ {
IsUpdating = false; IsUpdating = false;
if (_renderTask is null || _cancelToken is null) return; if (_cancelToken is null || _renderTask is null || _wallpaperRenderTask is null) return;
_cancelToken.Cancel(); _cancelToken.Cancel();
_wallpaperRenderTask.Wait();
_renderTask.Wait(); _renderTask.Wait();
_cancelToken = null; _wallpaperRenderTask = null;
_renderTask = null; _renderTask = null;
_cancelToken = null;
} }
private void RenderTask() private void RenderTask()
{ {
try try
{ {
_wallpaperRenderer.SetActive(true);
_renderer.SetActive(true); _renderer.SetActive(true);
float delta; float delta;
@@ -500,7 +504,6 @@ namespace SpineViewer.ViewModels.MainWindow
finally finally
{ {
_renderer.SetActive(false); _renderer.SetActive(false);
_wallpaperRenderer.SetActive(false);
} }
} }
@@ -538,16 +541,6 @@ namespace SpineViewer.ViewModels.MainWindow
sp.Update(delta * _speed); sp.Update(delta * _speed);
} }
} }
}
private void UpdateRenderFrame()
{
// 同步视图
if (_wallpaperView)
{
using var view = _renderer.GetView();
_wallpaperRenderer.SetView(view);
}
// 更新背景图位置和缩放 // 更新背景图位置和缩放
lock (_bgLock) lock (_bgLock)
@@ -579,23 +572,27 @@ namespace SpineViewer.ViewModels.MainWindow
bg.Rotation = view.Rotation; bg.Rotation = view.Rotation;
} }
} }
}
private void UpdateRenderFrame()
{
if (!_vmMain.IsVisible)
return;
// 清除背景 // 清除背景
if (_vmMain.IsVisible) _renderer.Clear(_backgroundColor); _renderer.Clear(_backgroundColor);
if (_wallpaperView) _wallpaperRenderer.Clear(_backgroundColor);
// 渲染背景 // 渲染背景
lock (_bgLock) lock (_bgLock)
{ {
if (_backgroundImageSprite is not null) if (_backgroundImageSprite is not null)
{ {
if (_vmMain.IsVisible) _renderer.Draw(_backgroundImageSprite); _renderer.Draw(_backgroundImageSprite);
if (_wallpaperView) _wallpaperRenderer.Draw(_backgroundImageSprite);
} }
} }
// 渲染坐标轴 // 渲染坐标轴
if (_showAxis && _vmMain.IsVisible) if (_showAxis)
{ {
_renderer.Draw(_axisVertices); _renderer.Draw(_axisVertices);
} }
@@ -607,31 +604,83 @@ namespace SpineViewer.ViewModels.MainWindow
{ {
if (_cancelToken?.IsCancellationRequested ?? true) break; // 提前中止 if (_cancelToken?.IsCancellationRequested ?? true) break; // 提前中止
if (_vmMain.IsVisible) // 为选中对象绘制一个半透明背景
if (sp.IsSelected)
{ {
// 为选中对象绘制一个半透明背景 var rc = sp.GetCurrentBounds().ToFloatRect();
if (sp.IsSelected) _selectedBackgroundVertices[0] = new(new(rc.Left, rc.Top), _selectedBackgroundColor);
{ _selectedBackgroundVertices[1] = new(new(rc.Left + rc.Width, rc.Top), _selectedBackgroundColor);
var rc = sp.GetCurrentBounds().ToFloatRect(); _selectedBackgroundVertices[2] = new(new(rc.Left + rc.Width, rc.Top + rc.Height), _selectedBackgroundColor);
_selectedBackgroundVertices[0] = new(new(rc.Left, rc.Top), _selectedBackgroundColor); _selectedBackgroundVertices[3] = new(new(rc.Left, rc.Top + rc.Height), _selectedBackgroundColor);
_selectedBackgroundVertices[1] = new(new(rc.Left + rc.Width, rc.Top), _selectedBackgroundColor); _renderer.Draw(_selectedBackgroundVertices);
_selectedBackgroundVertices[2] = new(new(rc.Left + rc.Width, rc.Top + rc.Height), _selectedBackgroundColor);
_selectedBackgroundVertices[3] = new(new(rc.Left, rc.Top + rc.Height), _selectedBackgroundColor);
_renderer.Draw(_selectedBackgroundVertices);
}
// 仅在预览画面临时启用调试模式
sp.EnableDebug = true;
_renderer.Draw(sp);
sp.EnableDebug = false;
} }
if (_wallpaperView) _wallpaperRenderer.Draw(sp);
// 仅在预览画面临时启用调试模式
sp.EnableDebug = true;
_renderer.Draw(sp);
sp.EnableDebug = false;
} }
} }
// 显示内容 // 显示内容
if (_vmMain.IsVisible) _renderer.Display(); _renderer.Display();
if (_wallpaperView) _wallpaperRenderer.Display(); }
private void WallpaperRenderTask()
{
try
{
_wallpaperRenderer.SetActive(true);
while (!_cancelToken?.IsCancellationRequested ?? false)
{
if (!_wallpaperView)
{
Thread.Sleep(10);
continue;
}
// 同步视图
using var view = _renderer.GetView();
_wallpaperRenderer.SetView(view);
// 清除背景
_wallpaperRenderer.Clear(_backgroundColor);
// 渲染背景
lock (_bgLock)
{
if (_backgroundImageSprite is not null)
{
_wallpaperRenderer.Draw(_backgroundImageSprite);
}
}
// 渲染 Spine
lock (_models.Lock)
{
foreach (var sp in _models.Where(sp => sp.IsShown && (!_renderSelectedOnly || sp.IsSelected)).Reverse())
{
if (_cancelToken?.IsCancellationRequested ?? true)
break; // 提前中止
_wallpaperRenderer.Draw(sp);
}
}
// 显示渲染
_wallpaperRenderer.Display();
}
}
catch (Exception ex)
{
_logger.Debug(ex.ToString());
_logger.Fatal("Wallpaper render task stopped, {0}", ex.Message);
MessagePopupService.Error(ex.ToString());
}
finally
{
_wallpaperRenderer.SetActive(false);
}
} }
public RendererWorkspaceConfigModel WorkspaceConfig public RendererWorkspaceConfigModel WorkspaceConfig