Медленное рисование экрана в приложении WinNet .Net C # - PullRequest
0 голосов
/ 16 ноября 2009

У меня очень большое приложение winforms C # .net 2.0, в котором есть некоторые проблемы с рисованием.

При переходе к различным формам вы можете видеть нарисованные элементы управления и даже строку заголовка формы, которая изменяется и затем исчезает.

Базовая форма, от которой наследуются все другие формы, имеет следующий код в своем конструкторе. Включая установку DoubleBuffering в true.

this.SetStyle(ControlStyles.UserPaint, true);

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

this.SetStyle(ControlStyles.ResizeRedraw, true);

this.UpdateStyles();

Формы также имеют фоновый градиент, но его удаление не влияет на скорость.

Все элементы управления и формы наследуются от базовых версий.

Что я могу добавить или проверить, чтобы помочь со скоростью рисования?

Код внутри OnPaint

if (this.b_UseBackgroundGradient)
        {
            Graphics graphics = e.Graphics;

            Rectangle backgroundRectangle = this.ClientRectangle;

            this.SuspendLayout();
            if (backgroundRectangle.Width != 0 && backgroundRectangle.Height != 0) 
            {

                using (Brush backgroundBrush = new LinearGradientBrush(backgroundRectangle, base.BackColor, this.BackGradiantColour, LinearGradientMode.ForwardDiagonal))
                {
                    graphics.FillRectangle(backgroundBrush, backgroundRectangle);
                }
            }
            this.ResumeLayout();
        }
        else
        {
            base.OnPaint(e);
        }

Ответы [ 2 ]

2 голосов
/ 16 ноября 2009

Я бы сказал, что ваша «оптимизация» направлена ​​на то, чтобы обмануть глаз, полагая, что все, что вы рисуете самостоятельно в OnPaint, будет казаться быстрее, но, кроме этого, оно действительно замедлит ваше приложение вниз. Особенно, если у вас открыто много форм, поскольку каждая из форм создаст огромное растровое изображение, которое используется для двойной буферизации.

Итак: чтобы увеличить скорость: удалите весь код, указанный выше, и вставляйте его только там, где это абсолютно необходимо.

РЕДАКТИРОВАТЬ : После того, как я увидел ваш код OnPaint: удалите ВСЕ "оптимизации" И переместите вместо него код OnPaint в OnPaintBackground. Убедитесь, что вы не вызываете base.OnPaintBackground. Выбросьте Susped / Resume layout.

Все, что вам действительно нужно сделать , это использовать OnPaintBackground вместо OnPaint, а все остальное позаботится о себе.

0 голосов
/ 16 ноября 2009

Google вокруг SuspendLayout / ResumeLayout. Я также хотел бы посмотреть, правильно ли указывать информацию о стилее в конструкторе или есть лучший метод, вызываемый перед конструктором.

...