此代码每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;
}
答案 0 :(得分:5)
您每次都在创建新设备。
您应该只创建一次设备,在启动代码中创建一次然后继续使用它。
此外,我怀疑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()
在运行时打印当前使用的资源(即使使用堆栈跟踪)。