2017-08-06 75 views
0

我已经创建了一个叠加在现有图像上的时间的图像效果。每当我在Win2D CanvasDrawingSession上使用DrawImage或DrawText时,我所遇到的问题似乎都是持久的内存泄漏。随着时间的推移这变得非常重要我必须在释放资源方面错过了一些东西,但我没有看到它。如果我注释掉DrawImage和DrawText代码行,内存泄漏将停止。使用Win2D的内存泄漏CanvasDrawingSession

 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; 
    } 

回答

4

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