我的SharpDX应用程序中的内存泄漏

Bjo*_*obs 2 c# memory directx sharpdx

此代码每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;
} 
Run Code Online (Sandbox Code Playgroud)

thu*_*eys 5

您每次都在创建新设备.

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

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

       var stream = Surface.ToStream(s, ImageFileFormat.Bmp);
       pictureBox1.Image = new Bitmap(stream);
       stream.Dispose();
Run Code Online (Sandbox Code Playgroud)

正如汉斯帕斯特所提到的那样,也Bitmap需要处理.

您可以通过帮助程序非常轻松地调试SharpDX中的内存泄漏,以对未发布的COM资源进行诊断.在应用程序开头设置此变量:

SharpDX.Configuration.EnableObjectTracking = true;
Run Code Online (Sandbox Code Playgroud)

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

ObjectTracker.ReportActiveObjects() 可以调用它来在运行时打印当前使用的资源(即使使用堆栈跟踪).