RenderTargetBitmap Утечка памяти - PullRequest
4 голосов
/ 16 июля 2011

пытаюсь сделать изображение с помощью RenderTargetBitmap каждый раз, когда я создаю экземпляр из RenderTargetBitmap для рендеринга изображения, память увеличивается, а когда это делается, память никогда не освобождается и это код:

RenderTargetBitmap rtb = new RenderTargetBitmap((int)(renderWidth * dpiX / 96.0),
                                                (int)(renderHeight * dpiY / 96.0),
                                                dpiX,
                                                dpiY,
                                                PixelFormats.Pbgra32);
    DrawingVisual dv = new DrawingVisual();
    using (DrawingContext ctx = dv.RenderOpen())
    {
       VisualBrush vb = new VisualBrush(target);
       ctx.DrawRectangle(vb, null, new System.Windows.Rect(new Point(0, 0), new Point(bounds.Width, bounds.Height)));
    }
    rtb.Render(dv);

пожалуйста, мне нужна помощь как я могу освободить память и спасибо за все.

Ответы [ 2 ]

3 голосов
/ 22 июля 2014

если вы отслеживаете поведение класса RenderTargetBitmap с помощью Resource Monitor , вы можете видеть, что при каждом вызове этого класса вы теряете 500 КБ памяти. Мой ответ на ваш вопрос: не используйте RenderTargetBitmap класс так много раз

Событие не может высвободить использованную память RenderTargetBitmap.

Если вам действительно нужно использовать класс RenderTargetBitmap, просто добавьте эти строки в конец вашего кода.

        GC.Collect()
        GC.WaitForPendingFinalizers()
        GC.Collect()

это может решить вашу проблему:

    RenderTargetBitmap rtb = new RenderTargetBitmap((int)(renderWidth * dpiX / 96.0),
                                                    (int)(renderHeight * dpiY / 96.0),
                                                    dpiX,
                                                    dpiY,
                                                    PixelFormats.Pbgra32);
        DrawingVisual dv = new DrawingVisual();
        using (DrawingContext ctx = dv.RenderOpen())
        {
           VisualBrush vb = new VisualBrush(target);
           ctx.DrawRectangle(vb, null, new System.Windows.Rect(new Point(0, 0), new Point(bounds.Width, bounds.Height)));
        }
        rtb.Render(dv);

        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
0 голосов
/ 16 июля 2011

Это не настоящая утечка памяти, по крайней мере, по моему опыту.Вы увидите, как в диспетчере задач увеличивается потребление памяти, но сборщик мусора должен позаботиться об этом, когда это действительно необходимо (или вы можете сами вызвать GC.Collect (), чтобы увидеть это).Тем не менее, если вы рисуете фигуры, DrawingContext / DrawingVisuals не идеальны в WPF.Вам было бы намного лучше использовать векторную графику, и у вас был бы ряд дополнительных преимуществ, включая масштабируемость и отсутствие проблемы с использованием памяти.

Смотрите мой ответ на аналогичный вопрос здесь: Программа занимаетслишком много памяти

...