【发布时间】:2016-02-20 19:34:11
【问题描述】:
我使用BitmapEncoder 类将捕获的摄像机视频帧转换为流。当使用 DispatcherTimer 在循环中执行此操作时,我的应用程序会逐渐泄漏内存,但从未恢复任何内存。
我使用thisMicrosoft 示例作为基础。
泄露的实际代码。
var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;
using (var videoFrame = new VideoFrame(BitmapPixelFormat.Rgba16, (int)previewProperties.Width, (int)previewProperties.Height))
{
using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
{
using (var currentFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame))
{
// Collect the resulting frame
using (SoftwareBitmap previewFrame = currentFrame.SoftwareBitmap)
{
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
//MEMORY LEAK
encoder.SetSoftwareBitmap(previewFrame);
await encoder.FlushAsync();
//DO something with the stream
}
}
}
}
【问题讨论】:
-
你有什么问题?
-
当然如何防止内存泄漏
-
@Freggar:您没有证据证明存在内存泄漏。至少尝试手动强制 GC.Collect 并 waitForFinalization 看看是否有任何内存释放。请记住,.net 应用程序仅在存在内存压力时才会触发垃圾收集器并释放内存。
-
别猜了,找个内存分析器,看看哪些对象没有被释放,哪些对象保存在内存中。
标签: c# .net memory-leaks windows-store-apps win-universal-app