修复使用FFmpeg导出时的卡死问题
This commit is contained in:
@@ -62,7 +62,7 @@ namespace Spine.Exporters
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected override SFMLImageVideoFrame GetFrame(SpineObject[] spines)
|
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 tex = new RenderTexture(_renderTexture.Size.X, _renderTexture.Size.Y);
|
||||||
using var view = _renderTexture.GetView();
|
using var view = _renderTexture.GetView();
|
||||||
tex.SetView(view);
|
tex.SetView(view);
|
||||||
|
|||||||
@@ -142,7 +142,6 @@ namespace SpineViewer.ViewModels.Exporters
|
|||||||
{
|
{
|
||||||
if (!Export_CanExecute(args)) return;
|
if (!Export_CanExecute(args)) return;
|
||||||
Export(args.Cast<SpineObjectModel>().ToArray());
|
Export(args.Cast<SpineObjectModel>().ToArray());
|
||||||
// XXX: 导出途中应该停掉渲染好一些, 让性能专注在导出上
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool Export_CanExecute(IList? args)
|
private bool Export_CanExecute(IList? args)
|
||||||
|
|||||||
@@ -83,6 +83,8 @@ namespace SpineViewer.ViewModels.Exporters
|
|||||||
exporter.Rotation = view.Rotation;
|
exporter.Rotation = view.Rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_vmMain.SFMLRendererViewModel.StopRender();
|
||||||
|
|
||||||
if (_exportSingle)
|
if (_exportSingle)
|
||||||
{
|
{
|
||||||
var filename = $"ffmpeg_{timestamp}_{Guid.NewGuid().ToString()[..6]}_{_fps}{FormatSuffix}";
|
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.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_vmMain.SFMLRendererViewModel.StartRender();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,10 @@ namespace SpineViewer.ViewModels.Exporters
|
|||||||
exporter.Rotation = view.Rotation;
|
exporter.Rotation = view.Rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BUG: FFmpeg 导出时对 RenderTexture 的频繁资源申请释放似乎使 SFML 库内部出现问题, 会卡死所有使用 SFML 的地方, 包括渲染线程
|
||||||
|
// 所以临时把渲染线程停掉, 只让此处使用 SFML 资源, 这个问题或许和多个线程同时使用渲染资源有关
|
||||||
|
_vmMain.SFMLRendererViewModel.StopRender();
|
||||||
|
|
||||||
if (_exportSingle)
|
if (_exportSingle)
|
||||||
{
|
{
|
||||||
var filename = $"video_{timestamp}_{Guid.NewGuid().ToString()[..6]}_{_fps}{FormatSuffix}";
|
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.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_vmMain.SFMLRendererViewModel.StartRender();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ namespace SpineViewer.ViewModels.Exporters
|
|||||||
exporter.Rotation = view.Rotation;
|
exporter.Rotation = view.Rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_vmMain.SFMLRendererViewModel.StopRender();
|
||||||
|
|
||||||
if (_exportSingle)
|
if (_exportSingle)
|
||||||
{
|
{
|
||||||
var folderName = $"frames_{timestamp}_{Guid.NewGuid().ToString()[..6]}_{_fps}";
|
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.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_vmMain.SFMLRendererViewModel.StartRender();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user