Как я могу сделать обновление элемента управления быстрее? - PullRequest
1 голос
/ 10 мая 2009

У меня есть пользовательский элемент управления в C #. Я заметил, что вызов Refresh намного медленнее, чем хотелось бы (около 0,1 мс), даже когда у меня пустая функция RePaint. По сути, мое приложение обрабатывает сетку и обновляет каждую ячейку сетки. Это довольно неэффективное поведение по замыслу; при включении я хочу видеть, что на самом деле делается каждый шаг обработки, и каждый шаг заканчивается только изменением одной ячейки. Переключение двойной буферизации не имеет большого значения.

Может кто-нибудь дать совет?

В настоящее время лучшее улучшение, которое я придумал, - это заменить мой звонок на Refresh звонком на Refresh2. Последняя функция является точной копией Repaint, за исключением двух строк, добавленных вверху, Graphics g = Graphics.FromHwnd(this.Handle); g.Clear(BackColor); и замены e.Graphics на g. Я подозреваю, что в этом есть какой-то недостаток, но он снижает скорость рисования вдвое. Обратите внимание, что в элементе управления, с которым я работаю, нет подкомпонентов, поэтому такие вещи, как проверка, не так уж и важны.

Ответы [ 2 ]

2 голосов
/ 10 мая 2009

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

0 голосов
/ 10 мая 2009

Является ли обновление автоматическим повторяющимся событием или в ответ на пользовательское событие?

В первом случае он должен быть асинхронным (в своем собственном потоке). Если в ответ на пользовательское событие это также будет верно в том случае, если «обновление» не является критическим для события.

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

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

...