修复部分资源泄漏

This commit is contained in:
ww-rm
2025-04-05 01:14:59 +08:00
parent 204dcd6498
commit 058534ba67
3 changed files with 37 additions and 15 deletions

View File

@@ -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;

View File

@@ -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>

View File

@@ -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);
} }