修复部分资源泄漏
This commit is contained in:
@@ -120,7 +120,7 @@ namespace SpineViewer.Controls
|
|||||||
RenderWindow.Size = new((uint)sizeX, (uint)sizeY);
|
RenderWindow.Size = new((uint)sizeX, (uint)sizeY);
|
||||||
|
|
||||||
// 将 view 的大小设置成于 resolution 相同的大小, 其余属性都不变
|
// 将 view 的大小设置成于 resolution 相同的大小, 其余属性都不变
|
||||||
var view = RenderWindow.GetView();
|
using var view = RenderWindow.GetView();
|
||||||
var signX = Math.Sign(view.Size.X);
|
var signX = Math.Sign(view.Size.X);
|
||||||
var signY = Math.Sign(view.Size.Y);
|
var signY = Math.Sign(view.Size.Y);
|
||||||
view.Size = new(value.Width * signX, value.Height * signY);
|
view.Size = new(value.Width * signX, value.Height * signY);
|
||||||
@@ -140,12 +140,13 @@ namespace SpineViewer.Controls
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
var center = RenderWindow.GetView().Center;
|
using var view = RenderWindow.GetView();
|
||||||
|
var center = view.Center;
|
||||||
return new(center.X, center.Y);
|
return new(center.X, center.Y);
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
var view = RenderWindow.GetView();
|
using var view = RenderWindow.GetView();
|
||||||
view.Center = new(value.X, value.Y);
|
view.Center = new(value.X, value.Y);
|
||||||
RenderWindow.SetView(view);
|
RenderWindow.SetView(view);
|
||||||
}
|
}
|
||||||
@@ -158,11 +159,15 @@ namespace SpineViewer.Controls
|
|||||||
[Browsable(false)]
|
[Browsable(false)]
|
||||||
public float Zoom
|
public float Zoom
|
||||||
{
|
{
|
||||||
get => resolution.Width / Math.Abs(RenderWindow.GetView().Size.X);
|
get
|
||||||
|
{
|
||||||
|
using var view = RenderWindow.GetView();
|
||||||
|
return resolution.Width / Math.Abs(view.Size.X);
|
||||||
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
value = Math.Clamp(value, ZOOM_MIN, ZOOM_MAX);
|
value = Math.Clamp(value, ZOOM_MIN, ZOOM_MAX);
|
||||||
var view = RenderWindow.GetView();
|
using var view = RenderWindow.GetView();
|
||||||
var signX = Math.Sign(view.Size.X);
|
var signX = Math.Sign(view.Size.X);
|
||||||
var signY = Math.Sign(view.Size.Y);
|
var signY = Math.Sign(view.Size.Y);
|
||||||
view.Size = new(resolution.Width / value * signX, resolution.Height / value * signY);
|
view.Size = new(resolution.Width / value * signX, resolution.Height / value * signY);
|
||||||
@@ -177,10 +182,14 @@ namespace SpineViewer.Controls
|
|||||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
||||||
public float Rotation
|
public float Rotation
|
||||||
{
|
{
|
||||||
get => RenderWindow.GetView().Rotation;
|
get
|
||||||
|
{
|
||||||
|
using var view = RenderWindow.GetView();
|
||||||
|
return view.Rotation;
|
||||||
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
var view = RenderWindow.GetView();
|
using var view = RenderWindow.GetView();
|
||||||
view.Rotation = value;
|
view.Rotation = value;
|
||||||
RenderWindow.SetView(view);
|
RenderWindow.SetView(view);
|
||||||
}
|
}
|
||||||
@@ -193,10 +202,14 @@ namespace SpineViewer.Controls
|
|||||||
[Browsable(false)]
|
[Browsable(false)]
|
||||||
public bool FlipX
|
public bool FlipX
|
||||||
{
|
{
|
||||||
get => RenderWindow.GetView().Size.X < 0;
|
get
|
||||||
|
{
|
||||||
|
using var view = RenderWindow.GetView();
|
||||||
|
return view.Size.X < 0;
|
||||||
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
var view = RenderWindow.GetView();
|
using var view = RenderWindow.GetView();
|
||||||
var size = view.Size;
|
var size = view.Size;
|
||||||
if (size.X > 0 && value || size.X < 0 && !value)
|
if (size.X > 0 && value || size.X < 0 && !value)
|
||||||
size.X *= -1;
|
size.X *= -1;
|
||||||
@@ -212,10 +225,14 @@ namespace SpineViewer.Controls
|
|||||||
[Browsable(false)]
|
[Browsable(false)]
|
||||||
public bool FlipY
|
public bool FlipY
|
||||||
{
|
{
|
||||||
get => RenderWindow.GetView().Size.Y < 0;
|
get
|
||||||
|
{
|
||||||
|
using var view = RenderWindow.GetView();
|
||||||
|
return view.Size.Y < 0;
|
||||||
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
var view = RenderWindow.GetView();
|
using var view = RenderWindow.GetView();
|
||||||
var size = view.Size;
|
var size = view.Size;
|
||||||
if (size.Y > 0 && value || size.Y < 0 && !value)
|
if (size.Y > 0 && value || size.Y < 0 && !value)
|
||||||
size.Y *= -1;
|
size.Y *= -1;
|
||||||
|
|||||||
@@ -8,13 +8,14 @@ using System.Linq;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
|
||||||
|
|
||||||
namespace SpineViewer.Exporter
|
namespace SpineViewer.Exporter
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 导出参数基类
|
/// 导出参数基类
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class ExportArgs : ImplementationResolver<ExportArgs, ExportImplementationAttribute, ExportType>
|
public abstract class ExportArgs : ImplementationResolver<ExportArgs, ExportImplementationAttribute, ExportType>, IDisposable
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 创建指定类型导出参数
|
/// 创建指定类型导出参数
|
||||||
@@ -34,6 +35,10 @@ namespace SpineViewer.Exporter
|
|||||||
RenderSelectedOnly = renderSelectedOnly;
|
RenderSelectedOnly = renderSelectedOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~ExportArgs() { Dispose(false); }
|
||||||
|
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }
|
||||||
|
protected virtual void Dispose(bool disposing) { View?.Dispose(); }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 输出文件夹
|
/// 输出文件夹
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -81,14 +81,14 @@ namespace SpineViewer.Spine
|
|||||||
// 除此之外, 似乎还和 tex 的 Dispose 有关
|
// 除此之外, 似乎还和 tex 的 Dispose 有关
|
||||||
// 如果不对 tex 进行 Dispose, 那么不管是否 Draw 都正常不会死锁
|
// 如果不对 tex 进行 Dispose, 那么不管是否 Draw 都正常不会死锁
|
||||||
var tex = new SFML.Graphics.RenderTexture(PREVIEW_WIDTH, PREVIEW_HEIGHT);
|
var tex = new SFML.Graphics.RenderTexture(PREVIEW_WIDTH, PREVIEW_HEIGHT);
|
||||||
tex.SetView(bounds.GetView(PREVIEW_WIDTH, PREVIEW_HEIGHT));
|
using var view = bounds.GetView(PREVIEW_WIDTH, PREVIEW_HEIGHT);
|
||||||
|
tex.SetView(view);
|
||||||
tex.Clear(SFML.Graphics.Color.Transparent);
|
tex.Clear(SFML.Graphics.Color.Transparent);
|
||||||
tex.Draw(this);
|
tex.Draw(this);
|
||||||
tex.Display();
|
tex.Display();
|
||||||
Preview = tex.Texture.CopyToBitmap();
|
Preview = tex.Texture.CopyToBitmap();
|
||||||
|
|
||||||
// 取最后一个作为初始, 尽可能去显示非默认的内容
|
// 取最后一个作为初始, 尽可能去显示非默认的内容
|
||||||
//skin = SkinNames.Last();
|
|
||||||
setAnimation(0, AnimationNames.Last());
|
setAnimation(0, AnimationNames.Last());
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
@@ -320,7 +320,7 @@ namespace SpineViewer.Spine
|
|||||||
private void reloadSkins()
|
private void reloadSkins()
|
||||||
{
|
{
|
||||||
clearSkin();
|
clearSkin();
|
||||||
foreach (var s in loadedSkins) addSkin(s);
|
foreach (var s in loadedSkins.Distinct()) addSkin(s);
|
||||||
update(0);
|
update(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user