2017-08-06 13 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を作成したことが原因であることを発見しました。いったんグローバルデバイスに移動すると、リークの状況は解決されました。

関連する問題