1

无论如何,我正在尝试从应用程序的某个窗口录制视频(该窗口显示了一些使用 DirectX 构建的图形)

我实际上正在做的是,从该窗口拍摄快照并将其从 Aforge.net 传递给 AVIWriter,我每秒重复该过程 20 次以获得 20fps 的视频。

在 30 到 40 秒内一切正常,再过一段时间就会出现内存不足异常。在使用 JetBrains dotMemory 进行分析后,我发现非托管内存正在迅速增加。尽管调用 Dispose() 是为了删除分配。内存消耗仍然很高。我也尝试过使用

GC.Collect();
GC.WaitForPendingFinalizers();

但在这里我的代码没有成功,它在Backgroundworker中运行,每50毫秒重复一次,直到点击CancellationPending按钮。

DisplayMode dm = device.DisplayMode;
Bitmap bmp = null;
Surface renderTarget = device.GetRenderTarget(0);
Surface destTarget = device.CreateOffscreenPlainSurface(ClientRectangle.Width, ClientRectangle.Height, dm.Format, Pool.SystemMemory);
device.GetRenderTargetData(renderTarget, destTarget);
GraphicsStream gs = SurfaceLoader.SaveToStream(ImageFileFormat.Bmp, destTarget);
renderTarget.Dispose();
destTarget.Dispose();
bmp = new Bitmap(gs);
gs.Dispose();
image = new Bitmap(bmp, size);
bmp.Dispose();
writer.AddFrame(image);
image.Dispose();
GC.Collect();
GC.WaitForPendingFinalizers();
4

0 回答 0