我使用BitmapSource将帧绘制为来自IP Camera的视频。以下是摘要代码。
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
。
我的应用程序是32位,IP Camera的分辨率是1280x960,每秒帧数是25,有4个摄像头。每个位图帧大约为3.5 MB。这意味着此情况下的速度分配内存大约为3,5 * 25 * 4 = 350 MB /秒。
因此内存增加得非常快,似乎GC无法覆盖它。因此导致"The application is not responding"
。
我试图在每个while循环中调用GC.Collect()
,如下面的代码所示。申请工作得很好。但这导致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消耗,我试图通过下面的计时器线程在1秒后调用GC.Collect()
void TimerThread()
{
while(true)
{
GC::Collect();
GC::WaitForPendingFinalizers();
Sleep(1000);
}
}
这种方式解决了CPU消耗问题。但问题是内存使用量仍然存在。
有人可以告诉我解决问题的最佳方法。