diff --git a/Spine/Exporters/FFmpegVideoExporter.cs b/Spine/Exporters/FFmpegVideoExporter.cs index 5bc2346..744b899 100644 --- a/Spine/Exporters/FFmpegVideoExporter.cs +++ b/Spine/Exporters/FFmpegVideoExporter.cs @@ -62,7 +62,7 @@ namespace Spine.Exporters /// protected override SFMLImageVideoFrame GetFrame(SpineObject[] spines) { - // XXX: 不知道为什么用 FFmpeg 必须临时创建 RenderTexture, 否则无法正常渲染 + // BUG: 不知道为什么用 FFmpeg 必须临时创建 RenderTexture, 否则无法正常渲染 using var tex = new RenderTexture(_renderTexture.Size.X, _renderTexture.Size.Y); using var view = _renderTexture.GetView(); tex.SetView(view); diff --git a/SpineViewer/ViewModels/Exporters/BaseExporterViewModel.cs b/SpineViewer/ViewModels/Exporters/BaseExporterViewModel.cs index c078c48..66fb38b 100644 --- a/SpineViewer/ViewModels/Exporters/BaseExporterViewModel.cs +++ b/SpineViewer/ViewModels/Exporters/BaseExporterViewModel.cs @@ -142,7 +142,6 @@ namespace SpineViewer.ViewModels.Exporters { if (!Export_CanExecute(args)) return; Export(args.Cast().ToArray()); - // XXX: 导出途中应该停掉渲染好一些, 让性能专注在导出上 } private bool Export_CanExecute(IList? args) diff --git a/SpineViewer/ViewModels/Exporters/CustomFFmpegExporterViewModel.cs b/SpineViewer/ViewModels/Exporters/CustomFFmpegExporterViewModel.cs index 2b5caa9..c31f8c2 100644 --- a/SpineViewer/ViewModels/Exporters/CustomFFmpegExporterViewModel.cs +++ b/SpineViewer/ViewModels/Exporters/CustomFFmpegExporterViewModel.cs @@ -83,6 +83,8 @@ namespace SpineViewer.ViewModels.Exporters exporter.Rotation = view.Rotation; } + _vmMain.SFMLRendererViewModel.StopRender(); + if (_exportSingle) { var filename = $"ffmpeg_{timestamp}_{Guid.NewGuid().ToString()[..6]}_{_fps}{FormatSuffix}"; @@ -168,6 +170,8 @@ namespace SpineViewer.ViewModels.Exporters } _vmMain.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None; } + + _vmMain.SFMLRendererViewModel.StartRender(); } } } diff --git a/SpineViewer/ViewModels/Exporters/FFmpegVideoExporterViewModel.cs b/SpineViewer/ViewModels/Exporters/FFmpegVideoExporterViewModel.cs index d206531..779c134 100644 --- a/SpineViewer/ViewModels/Exporters/FFmpegVideoExporterViewModel.cs +++ b/SpineViewer/ViewModels/Exporters/FFmpegVideoExporterViewModel.cs @@ -68,6 +68,10 @@ namespace SpineViewer.ViewModels.Exporters exporter.Rotation = view.Rotation; } + // BUG: FFmpeg 导出时对 RenderTexture 的频繁资源申请释放似乎使 SFML 库内部出现问题, 会卡死所有使用 SFML 的地方, 包括渲染线程 + // 所以临时把渲染线程停掉, 只让此处使用 SFML 资源, 这个问题或许和多个线程同时使用渲染资源有关 + _vmMain.SFMLRendererViewModel.StopRender(); + if (_exportSingle) { var filename = $"video_{timestamp}_{Guid.NewGuid().ToString()[..6]}_{_fps}{FormatSuffix}"; @@ -153,6 +157,8 @@ namespace SpineViewer.ViewModels.Exporters } _vmMain.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None; } + + _vmMain.SFMLRendererViewModel.StartRender(); } } } diff --git a/SpineViewer/ViewModels/Exporters/FrameSequenceExporterViewModel.cs b/SpineViewer/ViewModels/Exporters/FrameSequenceExporterViewModel.cs index add965f..fab8999 100644 --- a/SpineViewer/ViewModels/Exporters/FrameSequenceExporterViewModel.cs +++ b/SpineViewer/ViewModels/Exporters/FrameSequenceExporterViewModel.cs @@ -47,6 +47,8 @@ namespace SpineViewer.ViewModels.Exporters exporter.Rotation = view.Rotation; } + _vmMain.SFMLRendererViewModel.StopRender(); + if (_exportSingle) { var folderName = $"frames_{timestamp}_{Guid.NewGuid().ToString()[..6]}_{_fps}"; @@ -132,6 +134,8 @@ namespace SpineViewer.ViewModels.Exporters } _vmMain.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None; } + + _vmMain.SFMLRendererViewModel.StartRender(); } } }