我正试图从应用程序的某个窗口(该窗口显示一些使用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();