修复tex跨线程问题
This commit is contained in:
@@ -53,11 +53,6 @@ namespace SpineViewer.Exporter
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public ExportArgs ExportArgs { get; }
|
public ExportArgs ExportArgs { get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 渲染目标
|
|
||||||
/// </summary>
|
|
||||||
private SFML.Graphics.RenderTexture tex;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 可用于文件名的时间戳字符串
|
/// 可用于文件名的时间戳字符串
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -69,11 +64,24 @@ namespace SpineViewer.Exporter
|
|||||||
timestamp = DateTime.Now.ToString("yyMMddHHmmss");
|
timestamp = DateTime.Now.ToString("yyMMddHHmmss");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取供渲染的 SFML.Graphics.RenderTexture
|
||||||
|
/// </summary>
|
||||||
|
private SFML.Graphics.RenderTexture GetRenderTexture()
|
||||||
|
{
|
||||||
|
var tex = new SFML.Graphics.RenderTexture((uint)ExportArgs.Resolution.Width, (uint)ExportArgs.Resolution.Height);
|
||||||
|
tex.Clear(SFML.Graphics.Color.Transparent);
|
||||||
|
tex.SetView(ExportArgs.View);
|
||||||
|
return tex;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取单个模型的单帧画面
|
/// 获取单个模型的单帧画面
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected SFMLImageVideoFrame GetFrame(Spine.Spine spine)
|
protected SFMLImageVideoFrame GetFrame(Spine.Spine spine)
|
||||||
{
|
{
|
||||||
|
// tex 必须临时创建, 随用随取, 防止出现跨线程的情况
|
||||||
|
using var tex = GetRenderTexture();
|
||||||
tex.Clear(SFML.Graphics.Color.Transparent);
|
tex.Clear(SFML.Graphics.Color.Transparent);
|
||||||
tex.Draw(spine);
|
tex.Draw(spine);
|
||||||
tex.Display();
|
tex.Display();
|
||||||
@@ -85,6 +93,8 @@ namespace SpineViewer.Exporter
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected SFMLImageVideoFrame GetFrame(Spine.Spine[] spinesToRender)
|
protected SFMLImageVideoFrame GetFrame(Spine.Spine[] spinesToRender)
|
||||||
{
|
{
|
||||||
|
// tex 必须临时创建, 随用随取, 防止出现跨线程的情况
|
||||||
|
using var tex = GetRenderTexture();
|
||||||
tex.Clear(SFML.Graphics.Color.Transparent);
|
tex.Clear(SFML.Graphics.Color.Transparent);
|
||||||
foreach (var spine in spinesToRender) tex.Draw(spine);
|
foreach (var spine in spinesToRender) tex.Draw(spine);
|
||||||
tex.Display();
|
tex.Display();
|
||||||
@@ -110,15 +120,8 @@ namespace SpineViewer.Exporter
|
|||||||
{
|
{
|
||||||
var spinesToRender = spines.Where(sp => !ExportArgs.RenderSelectedOnly || sp.IsSelected).Reverse().ToArray();
|
var spinesToRender = spines.Where(sp => !ExportArgs.RenderSelectedOnly || sp.IsSelected).Reverse().ToArray();
|
||||||
|
|
||||||
// tex 必须临时创建, 防止出现跨线程的情况
|
|
||||||
using (tex = new SFML.Graphics.RenderTexture((uint)ExportArgs.Resolution.Width, (uint)ExportArgs.Resolution.Height))
|
|
||||||
{
|
|
||||||
tex.Clear(SFML.Graphics.Color.Transparent);
|
|
||||||
tex.SetView(ExportArgs.View);
|
|
||||||
if (ExportArgs.ExportSingle) ExportSingle(spinesToRender, worker);
|
if (ExportArgs.ExportSingle) ExportSingle(spinesToRender, worker);
|
||||||
else ExportIndividual(spinesToRender, worker);
|
else ExportIndividual(spinesToRender, worker);
|
||||||
}
|
|
||||||
tex = null;
|
|
||||||
|
|
||||||
Program.LogCurrentMemoryUsage();
|
Program.LogCurrentMemoryUsage();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user