gpt4 book ai didi

c# - 我的 SharpDX 应用程序中存在内存泄漏

转载 作者:行者123 更新时间:2023-12-02 00:37:54 24 4
gpt4 key购买 nike

此代码每 100 毫秒运行一次。内存使用量不断增加,直到达到 1.5 GB,然后崩溃。

void takeScreenShot()
{
Surface s;
s = CaptureScreen();
pictureBox1.Image = new Bitmap(Surface.ToStream(s, ImageFileFormat.Bmp));
s.Dispose();
}

public Surface CaptureScreen()
{
int width = Screen.PrimaryScreen.Bounds.Width;
int height = Screen.PrimaryScreen.Bounds.Height;
Device device = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.HardwareVertexProcessing, new PresentParameters(width, height));
DisplayMode disp = device.GetDisplayMode(0);
Surface s = Surface.CreateOffscreenPlain(device, disp.Width, disp.Height, Format.A8R8G8B8, Pool.Scratch);
device.GetFrontBufferData(0, s);
return s;
}

最佳答案

您每次都在创建一个新设备。

您应该只创建一次设备,在启动代码中创建一次,然后继续使用它。

此外,我怀疑 Surface.ToStream() 中存在内存泄漏,返回的流可能也需要处理。

       var stream = Surface.ToStream(s, ImageFileFormat.Bmp);
pictureBox1.Image = new Bitmap(stream);
stream.Dispose();

正如 Hans Passant 提到的,Bitmap 也需要处理。

您可以通过助手轻松调试 SharpDX 中的内存泄漏,以对未释放的 COM 资源进行诊断。在应用程序开始时设置此变量:

SharpDX.Configuration.EnableObjectTracking = true;

当您的应用程序退出时,它将打印一份未通过堆栈跟踪正确释放的 COM 对象的报告。这背后的类是 ObjectTracker .

可以调用

ObjectTracker.ReportActiveObjects() 在运行时打印当前使用的资源(甚至使用堆栈跟踪)。

关于c# - 我的 SharpDX 应用程序中存在内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25836881/

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