Медленная экранная краска в C # - PullRequest
2 голосов
/ 18 ноября 2010

Я поместил только несколько элементов управления в основную форму в C # и вижу, что каждый элемент управления рисуется очень медленно при загрузке формы.Это очень заметно для пользователя, и это беспокоит меня.Я не создаю никаких элементов управления во время выполнения, они уже находятся внутри формы.Я видел несколько связанных вопросов и нашел следующее предложение:

this.SetStyle(ControlStyles.UserPaint, true);

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

this.SetStyle(ControlStyles.ResizeRedraw, true);

this.UpdateStyles();

Это решение фактически заставляет мою форму загружаться еще медленнее.Я не могу себе представить, что случилось бы с формой, если бы она содержала более 30 элементов управления.

Есть предложения о том, что я должен делать?

Ответы [ 5 ]

1 голос
/ 18 ноября 2010

Вам необходимо предоставить больше информации.

Если вы используете наши стандартные элементы управления Visual Studio, и у вас их 5, и у вас возникают такие проблемы, то проблема ДОЛЖНА быть в другом месте - плохой графический драйвер или что-то подобное,

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

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

0 голосов
/ 22 декабря 2011

Попробуйте поместить изображение поверх формы с высотой и шириной и нарисуйте его.Он будет обновляться и рисовать быстрее.

0 голосов
/ 19 ноября 2010

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

0 голосов
/ 18 ноября 2010

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

Спасибо всем.

0 голосов
/ 18 ноября 2010

Не уверен, что это связано с вашей проблемой, потому что отсутствие информации, но я столкнулся с той же проблемой в какой-то момент, и я предоставлю подробности.

Более 5 лет назад я работал надПриложение киоска Windows Forms, которое было построено на .Net 1.1 (самое последнее на тот момент).Приложению требовалась модная графика, которая состояла из фонового изображения для основной формы и изображений со слоями прозрачности для различных элементов управления в форме.Реализация этого стандартным способом с использованием свойства BackgroundImage или события OnPaint в элементах управления привела к медленному интерфейсу.Мерцание присутствовало, и в тех случаях, когда в форму добавлялось много элементов управления, вы могли видеть, что они загружаются один за другим.

Проблема с элементами управления, которые включают прозрачность, заключается в том, что они используют другую модель рисования по сравнению сс теми, которые этого не делают.Такой элемент управления при получении события рисования должен будет переслать это событие своему родителю, который будет отображаться первым, и только после этого будет отображаться графика дочернего элемента.Это должно означать одно событие рисования, преобразованное в три (событие рисования для управления прозрачностью, затем событие рисования, пересылаемое родителю, затем событие рисования обратно для управления прозрачностью), но по какой-то странной причине кажется, что в Windows Forms .Net естьбольше таких событий краски передавалось от детей к родителям.Не знаю, что является причиной этого.Единственное, что я знаю, это то, что приложения VB6 или C ++ MFC, которые, как и .Net Windows Forms, также построены поверх Win32, не имеют проблемы.

В то время я пробовалколичество трюков из Интернета (например, тех, которые вы цитируете), но ни один из них не сработал.В итоге я создал собственный движок рендеринга поверх GDI +.Это не то, что я бы порекомендовал, так как это заняло у меня много времени, и в процессе я потерял функциональность, такую ​​как редактор визуальных форм.

Что я бы порекомендовал С учетом технологий, появившихся с тех пор, если вам нужно создать приложение с интенсивным использованием графики, лучше сделать это с помощью Windows Presentation Foundation (WPF), которая была оптимизирована для этого, а не с помощью Windows Forms.

...