Каковы самые быстрые настройки рендеринга GDI +? - PullRequest
14 голосов
/ 30 ноября 2011

Существует довольно много постов о рендеринге графики высокого качества, например:

Высококачественная библиотека масштабирования изображения

Мне нужно отрисовать около 6k + объекта (линия и эллипс) в графике с GDI +, со скоростью около 10 кадров в секунду.Поэтому мне нужно свойство минимально возможного качества для моей графики.

Вот что я сделал:

public static class GraphicsExtensions
{
    public static void ToHighQuality(this Graphics graphics)
    {
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphics.CompositingQuality = CompositingQuality.HighQuality;
        graphics.SmoothingMode = SmoothingMode.HighQuality;
        graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
    }

    public static void ToLowQuality(this Graphics graphics)
    {
        graphics.InterpolationMode = InterpolationMode.Low;
        graphics.CompositingQuality = CompositingQuality.HighSpeed;
        graphics.SmoothingMode = SmoothingMode.HighSpeed;
        graphics.TextRenderingHint = TextRenderingHint.SystemDefault;
        graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed;
    }
}

Я что-то забыл или это наилучший возможный экстремум для свойстваГрафика?
Я рисую со скоростью 5 кадров в секунду (202 мс / изображение) в более низком режиме и со скоростью 3 кадра в секунду (330 мс / изображение) в более высоком режиме.
Я не чувствую большой разницы, но я уменьшилмоя проблема с производительностью только для рисования ...

Некоторые номера:

Ответы [ 2 ]

13 голосов
/ 01 декабря 2011

GDI + не является высокопроизводительным решением для рендеринга. p / вызвать GDI или использовать DirectX напрямую, если вы хотите лучшую сырую производительность. Однако получить ускорение в 2 раза обычно вполне достижимо, просто немного оптимизировав перерисовку:

Тебе действительно нужно много рисовать? Будет ли изображение работать нормально с удаленными элементами?

Вы создаете и уничтожаете множество ручек и кистей или повторно используете несколько предопределенных? Есть ли какая-либо обработка, которую вы выполняете для построения или преобразования форм, которые вы можете выполнить на этапе предварительной обработки, чтобы он не повторялся без необходимости во время перерисовки?

Вы рисуете что-нибудь ненужное? Отбрасывать (отбрасывать) все, что находится за кадром. Если происходит много перерисовок (очень вероятно, с 6000 объектами), может быть возможно обнаружить и отбросить формы, которые полностью скрыты перед ними.

Можете ли вы объединить много линий в одну ломаную линию? Каждый вызов функции добавляет издержки, поэтому, если вы можете нарисовать несколько фигур или линий одним вызовом функции, он будет выполняться быстрее.

Вам нужно использовать эллипсы? Если они маленькие, вы можете получить лучшую производительность с 8- или 12-сторонним многоугольником без заметного снижения качества фигуры - стоит попробовать.

Оптимизация повторения. Если фигуры правильные (например, вы рисуете много кругов по 10 пикселей одного цвета), то нарисуйте один в растровое изображение, а затем скопируйте копии. Если есть обычный шаблон (например, шахматная доска), нарисуйте его небольшой фрагмент в растровом изображении и перетащите раздел, чтобы повторить его на своем изображении. (Просто убедитесь, что вы рисуете немасштабированные растровые изображения и они соответствуют экрану (dpi и bpp), чтобы вы получали самый быстрый тип блитов и не заканчивали медленным размытым билинейным фильтром)

Если есть много изменений цвета, возможно, вы сможете объединить их вместе, чтобы нарисовать все красные, затем синие и т. Д. - это позволяет избежать частого переключения между ручками / кистями.

Иногда вы можете получить, избегая отсечения - например, если вы рисуете текст и знаете, что все это будет видно, вы можете рисовать с отключенным отсечением. (Это использовалось для повышения производительности - может не помочь с аппаратным ускорением рендеринга, но стоит попробовать)

И наконец, помните, что при аппаратном ускорении вы можете не получить выгоды, отключив некоторые функции рендеринга. Если видеокарта способна рисовать 10 000 эллипсов со скоростью 500 кадров в секунду, но вы видите только 10 кадров в секунду, то отключение сглаживания, вероятно, не поможет вам увеличить частоту кадров - более вероятным узким местом будет ваш код, а GDI + занимает много времени сообщить графической карте, что визуализировать, а не медленную визуализацию графики. (YMMV - это будет зависеть от того, что вы визуализируете, от того, как GDI + справляется с этим, от аппаратного ускорения, от того, что делает с ним графический драйвер, и от того, насколько мощна ваша видеокарта)

0 голосов
/ 12 октября 2017

Для рисования изображений используйте низкое качество:

img = new Bitmap(img, w / 2, h / 2);
...