0

我正在使用 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消耗问题。但是内存使用量非常大的问题依然存在。

有人可以向我展示解决我的问题的最佳方法。

4

0 回答 0