内存泄漏使用Win2D CanvasDrawingSession

时间:2017-08-06 20:05:53

标签: uwp c++-cli win2d

我创建了一个图像效果,它在现有图像上覆盖了一段时间。每次我在Win2D CanvasDrawingSession上使用DrawImage或DrawText时,我遇到的问题似乎是持久性内存泄漏。这随着时间的推移变得非常重要我必须在解放资源方面遗漏一些东西,但我没有看到它。如果我注释掉DrawImage和DrawText代码行,内存泄漏就会停止。

        virtual void ProcessFrame(ProcessVideoFrameContext^ context)
    {
        time_t curtime = time(0);
        char buffer[16];
        struct tm info;
        localtime_s(&info, &curtime);
        strftime(buffer, sizeof(buffer), "%H:%M:%S", &info);
        std::string stime = std::string(buffer);
        std::wstring w_str = std::wstring(stime.begin(), stime.end());
        String^ sTime = ref new String(w_str.c_str());
        CanvasDevice^ device = ref new CanvasDevice();
        auto newBitmap = SoftwareBitmap::Convert(context->InputFrame->SoftwareBitmap, BitmapPixelFormat::Bgra8);

        auto inputBitmap = CanvasBitmap::CreateFromSoftwareBitmap(device, newBitmap);
        auto frameSize = inputBitmap->SizeInPixels.Width * inputBitmap->SizeInPixels.Height * 4;
        auto frameBuffer = ref new Windows::Storage::Streams::Buffer((unsigned int)frameSize);

        auto renderTarget = ref new CanvasRenderTarget(device, (float)inputBitmap->SizeInPixels.Width, (float)inputBitmap->SizeInPixels.Height, (float)inputBitmap->Dpi);

        auto ds = renderTarget->CreateDrawingSession();
//      ds->DrawImage(inputBitmap);

        auto format = ref new CanvasTextFormat();
        format->FontFamily = _fontFamily;
        format->FontSize = (float)_fontSize;
//      ds->DrawText(sTime, (float)_offsetX, (float)_offsetY, _fontColor, format);
        delete ds;

        renderTarget->GetPixelBytes(frameBuffer);

        SoftwareBitmap^ nxtBitmap = ref new SoftwareBitmap(BitmapPixelFormat::Bgra8, newBitmap->PixelWidth, newBitmap->PixelHeight);
        nxtBitmap->CopyFromBuffer(frameBuffer);
        SoftwareBitmap^ anBitmap = SoftwareBitmap::Convert(nxtBitmap, BitmapPixelFormat::Yuy2);
        anBitmap->CopyToBuffer(frameBuffer);

        // Copy the modified frame data to the output frame.
        context->OutputFrame->SoftwareBitmap->CopyFromBuffer(frameBuffer);

        delete format;
        delete nxtBitmap;
        delete anBitmap;

        delete inputBitmap;
        delete frameBuffer;
        delete renderTarget;

        delete sTime;
        delete device;
        delete newBitmap;
    }

1 个答案:

答案 0 :(得分:4)

我发现它是由于在每个帧上创建一个新的CanvasDevice。一旦我将其移动到全局设备,泄漏情况就会自行解决。