我正在使用 BitmapSource 将帧绘制为从 IP 摄像机获取的视频。以下是摘要代码。
while(true)
{
char* rgbBuffer = GetFrameFromCamera();
BitmapSource^ bitmapSource = BitmapSource::Create(resX, resY, 96, 96, PixelFormats::Bgr24, nullptr, (IntPtr)rgbBuffer, rgbBufferLength, linesize);
wpfVideoControl.Draw(bitmapSource);
delete []rgbBuffer;
}
问题是,从任务管理器查看的内存使用量非常大。并且经过一段时间后,当内存使用量大约为 1300MB 时,the application is not responding
.
我的应用是 32bit,IP Camera 的分辨率是 1280x960,每秒帧数是 25,有 4 个摄像头。每个位图帧约为 3.5 MB。这意味着这种情况下的速度分配内存约为 3,5*25*4 = 350 MB/秒。
所以内存增加得非常快,似乎 GC 无法覆盖它。因此造成"The application is not responding"
。
我试图GC.Collect()
在每个while循环中调用如下代码。该应用程序运行良好。但这会导致 CPU 消耗。
while(true)
{
GC::Collect();
GC::WaitForPendingFinalizers();
char* rgbBuffer = GetFrameFromCamera();
BitmapSource^ bitmapSource = BitmapSource::Create(resX, resY, 96, 96, PixelFormats::Bgr24, nullptr, (IntPtr)rgbBuffer, rgbBufferLength, linesize);
wpfVideoControl.Draw(bitmapSource);
delete []rgbBuffer;
}
为了避免 CPU 消耗,我尝试GC.Collect()
通过下面的计时器线程在 1s 后调用
void TimerThread()
{
while(true)
{
GC::Collect();
GC::WaitForPendingFinalizers();
Sleep(1000);
}
}
这种方式解决了CPU消耗问题。但是内存使用量非常大的问题依然存在。
有人可以向我展示解决我的问题的最佳方法。