gpt4 book ai didi

C# WPF BitmapSource 内存泄漏?

转载 作者:太空狗 更新时间:2023-10-29 23:10:20 27 4
gpt4 key购买 nike

我正在开发一个 BlackJack 程序,该程序显示 BlackJack 牌 table 、纸牌等。计划是它会使用自动化策略接连玩数千手牌。

我有一个 PlayerSeat UserControl,它包含一个绑定(bind)到 ObservableCollection 的 ItemsControl。此 CardInHand 类包含一个名为 CardImage 的 BitmapSource。创建实例后,它会使用以下代码从资源中加载卡片图像:

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

private BitmapSource GenerateCardImage() {
Stream TempStream = this.GetType().Assembly.GetManifestResourceStream("BlackJack.Resources.CardImages.Card_" + m_Card.ShortTitle + ".gif");
System.Drawing.Bitmap sourceBMP = new System.Drawing.Bitmap(TempStream);
BitmapSource tempBitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
sourceBMP.GetHbitmap(),
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
BitmapSizeOptions.FromWidthAndHeight(sourceBMP.Width, sourceBMP.Height)
);
TempStream.Dispose();
DeleteObject(sourceBMP.GetHbitmap());
return tempBitmapSource;
}

问题是,在我进行了约 500 轮(约 4000 手牌或约 10000 张牌)后,我遇到了 GDI+ 错误并且应用程序占用了约 400MB 的 RAM。这增长很快,并且与玩过的手数有关。

DeleteObject() 是我在另一个网站上找到的,它说这是从 Bitmap 释放资源的最佳方式。它可能会产生很小的影响,但不是我想要的。我也尝试过 Dispose()。

另一个网站说它与 ItemsSource 绑定(bind)有关。我删除了绑定(bind),内存仍然增长。相反,我离开了绑定(bind)并删除了生成位图的代码。它播放了 40,000 轮并且没有显着增长(在它运行的 40 分钟内可能增加了 20MB)。

ObservableCollection 在每一轮之后都被 Clear()ed。我已尝试使集合、CardInHand 和 BitmapSource 属性无效。

我怎样才能让这些图像显示在屏幕上,同时确保它们的对象在不再需要时被适本地销毁?

感谢您的宝贵时间。

最佳答案

所以首先,您只有 52 张牌。只需预先创建图像并在应用程序的整个生命周期内保留它们。毕竟这是一场黑 jack 游戏;可以安全地假设每张卡在某个时候都需要。

也就是说,从流创建 BitmapSource 对象时存在问题。处理流时,流持有的 byte[] 不会被释放。 See my own question here .我没有投票关闭作为副本的唯一原因是因为我认为你真的应该只创建一次卡片并完成它而不是创建这些图像 10,000 次以上。

关于C# WPF BitmapSource 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7218721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com