优化图像资源管理:1.初始化时创建512x384透明bitmap 2.中途不进行Dispose和设置为null 3.仅在控件Dispose时释放资源

This commit is contained in:
zqm
2025-10-30 15:01:57 +08:00
parent a6a6563c1b
commit 444c62efe4

View File

@@ -353,27 +353,61 @@ namespace JoyD.Windows.CS.Toprie
} }
/// <summary> /// <summary>
/// 初始化图像缓冲区 /// 初始化图像缓冲区和相关图像资源
/// </summary> /// </summary>
private void InitializeImageBuffer() private void InitializeImageBuffer()
{ {
try try
{ {
// 创建512*384大小的bitmap作为图像缓冲区 // 创建512*384大小的透明bitmap作为图像缓冲区
_imageBuffer = new Bitmap(BUFFER_WIDTH, BUFFER_HEIGHT); _imageBuffer = new Bitmap(BUFFER_WIDTH, BUFFER_HEIGHT);
Console.WriteLine($"图像缓冲区已初始化: {BUFFER_WIDTH}x{BUFFER_HEIGHT}"); Console.WriteLine($"图像缓冲区已初始化: {BUFFER_WIDTH}x{BUFFER_HEIGHT}");
// 初始化缓冲区为黑色背景 // 初始化缓冲区为透明背景
using (Graphics g = Graphics.FromImage(_imageBuffer)) using (Graphics g = Graphics.FromImage(_imageBuffer))
{ {
g.Clear(Color.Black); g.Clear(Color.Transparent);
}
// 初始化InfoImage为透明bitmap
lock (_infoImageLock)
{
_infoImage = new Bitmap(BUFFER_WIDTH, BUFFER_HEIGHT);
using (Graphics g = Graphics.FromImage(_infoImage))
{
g.Clear(Color.Transparent);
}
Console.WriteLine("InfoImage已初始化为透明bitmap");
}
// 初始化图像框的bitmap为透明
if (imageBox != null && !imageBox.IsDisposed)
{
imageBox.Image = new Bitmap(BUFFER_WIDTH, BUFFER_HEIGHT);
using (Graphics g = Graphics.FromImage(imageBox.Image))
{
g.Clear(Color.Transparent);
}
Console.WriteLine("图像框bitmap已初始化为透明");
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine($"初始化图像缓冲区失败: {ex.Message}"); Console.WriteLine($"初始化图像资源失败: {ex.Message}");
// 如果初始化失败确保_imageBuffer为null // 发生异常时释放已创建的资源
_imageBuffer = null; if (_imageBuffer != null)
{
_imageBuffer.Dispose();
_imageBuffer = null;
}
lock (_infoImageLock)
{
if (_infoImage != null)
{
_infoImage.Dispose();
_infoImage = null;
}
}
} }
} }
@@ -581,15 +615,22 @@ namespace JoyD.Windows.CS.Toprie
} }
// 按照用户要求收到图像数据后将图像保存到LastImage中 // 按照用户要求收到图像数据后将图像保存到LastImage中
// 不释放旧的LastImage仅在控件Dispose时释放
lock (_lastImageLock) lock (_lastImageLock)
{ {
// 释放旧的LastImage资源 // 如果是第一次设置LastImage,直接赋值
if (_lastImage != null) if (_lastImage == null)
{ {
try { _lastImage.Dispose(); } catch {} _lastImage = newImage;
}
else
{
// 后续更新时,使用临时变量保存新图像,然后替换引用
Image temp = newImage;
newImage = _lastImage;
_lastImage = temp;
// 注意这里不Dispose旧图像只在控件Dispose时统一释放
} }
// 设置新的LastImage
_lastImage = newImage;
} }
// 按照用户要求调用更新到UI // 按照用户要求调用更新到UI
@@ -697,8 +738,8 @@ namespace JoyD.Windows.CS.Toprie
{ {
using (Graphics g = Graphics.FromImage(_imageBuffer)) using (Graphics g = Graphics.FromImage(_imageBuffer))
{ {
// 清除缓冲区背景为 // 清除缓冲区背景为透明
g.Clear(Color.Black); g.Clear(Color.Transparent);
// 步骤1先将LastImage绘制到全局缓冲 // 步骤1先将LastImage绘制到全局缓冲
if (lastImage != null) if (lastImage != null)