什么时候应该调用GC.Collect()?

时间:2014-10-24 11:50:54

标签: wpf garbage-collection c++-cli bitmapsource

我使用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消耗问题。但问题是内存使用量仍然存在。

有人可以告诉我解决问题的最佳方法。

0 个答案:

没有答案