powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / GUI тормозит
7 сообщений из 7, страница 1 из 1
GUI тормозит
    #39024743
BugzzBunny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WPF. Обычно пишут, что если GUI тормозит, то надо считать не в потоке GUI. А что, если я считаю в другом потоке, и обновляю GUI тоже в другом потоке через Dispatcher, но логика обновления настолько интенсивная (много контролов обновляются, плюс это часто и циклически происходит), что GUI всё равно тормозит? А мне надо, чтобы были всегда активны некоторые другие контролы, типа отмены задания и прочие. А получается, что если нажать на отмену, то оно не сразу срабатывает, т. к. поток GUI занят перерисовкой.

Можно ли как-то для некоторых контролов выделить более высокий приоритет, чем для других? Т. е. чтобы даже если идёт интенсивная перерисовка одних контролов, то всегда какая-нибудь другая кнопка "Отмена" работала сразу, а не ждала, когда там другие контролы перерисуются?

Как другой вариант, придумал пока делать паузы (через Thread.Sleep) в итерациях обновления GUI, чтобы дать возможность обработать нажатие кнопки "Отмена". Но это кажется неоптимальным решением.
...
Рейтинг: 0 / 0
GUI тормозит
    #39024745
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BugzzBunny... но логика обновления настолько интенсивная (много контролов обновляются, плюс это часто и циклически происходит), что GUI всё равно тормозит?Пользователю нужно такое интенсивное обновление?

Как вариант - обновлять данные в контролах по таймеру, например, раз в 1 секунду.
...
Рейтинг: 0 / 0
GUI тормозит
    #39024759
BugzzBunny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КBugzzBunny... но логика обновления настолько интенсивная (много контролов обновляются, плюс это часто и циклически происходит), что GUI всё равно тормозит?Пользователю нужно такое интенсивное обновление?

Как вариант - обновлять данные в контролах по таймеру, например, раз в 1 секунду.
Ну я примерно так и думал - дать возможность потоку GUI закончить перерисовки и подождать - принять хоть какое-то управление от пользователя.

Т. е. с разными приоритетами для разных контролов идей в WPF нет? А то может быть так, что даже если раз в 1 секунду - перерисовка дольше 1 секунды может идти (например, забилась очередь команд на перерисовку - пока она не выполнилась, нажатие кнопок и прочее обрабатываться не будет).
...
Рейтинг: 0 / 0
GUI тормозит
    #39024760
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BugzzBunnyАлексей Кпропущено...
Пользователю нужно такое интенсивное обновление?

Как вариант - обновлять данные в контролах по таймеру, например, раз в 1 секунду.
Ну я примерно так и думал - дать возможность потоку GUI закончить перерисовки и подождать - принять хоть какое-то управление от пользователя.

Т. е. с разными приоритетами для разных контролов идей в WPF нет?Там в новом WPF можно делать биндинг с задержкой , это тоже вполне разумный вариант.
...
Рейтинг: 0 / 0
GUI тормозит
    #39024876
BugzzBunny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КBugzzBunnyпропущено...

Ну я примерно так и думал - дать возможность потоку GUI закончить перерисовки и подождать - принять хоть какое-то управление от пользователя.

Т. е. с разными приоритетами для разных контролов идей в WPF нет?Там в новом WPF можно делать биндинг с задержкой , это тоже вполне разумный вариант.
Спасибо, посмотрю.
...
Рейтинг: 0 / 0
GUI тормозит
    #39025473
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
важно учитывать, что ресурсы расходуются не только на прорисовку, но и на компановку элементов управления.
Проще говоря, нужно как следую продумать компоновку, чтоб изменение 1 контрола, не влияло на пересчет компоновки всех остальных.
При обновлении визуальных контролов делать это 30-60 раз в секунды по меньше мере глупо, но если такая задача все же необходима (для создания качественной анимации с высокой частотой кадров и минимальной нагрузкой), то необходимо использовать элементы интерфейса наследованные от Visual, а не от Control. Вообще все элементы управления имеющие визуальное представление наследованны либо от Visual для 2D, либо от Visual3D.
Есть количество элементов на экране большое, а их обновление занимает много времени (для прорисовки), то это самый лучший вариант. При этом, стоит подумать над тем, что лучше, заменить кучу контролов на 1 (который будет их всех прориросывать), либо декомпозировать
и объединить.
Так же, необходимо стремиться к тому, чтоб визуальное дерево не было слишком большим, чем более глубокое дерево, тем больше ресурсов будет уходить на маршутизируемые события, команды, компоновку (OverrideMeasure, OverrideArrange), относительное связывание, поиск элементов в дереве и т.д., так как вызов пересчета компоновки корневых элементов будет вызывать практически полные пересчет всех вложенных.
Так же для повышения производительности стоит почитать про bitmap кеширование. После того, как визуальный объект был сформирован (определен его размер и нарисован) его внешний вид сохраняет в bitmap кеш, который использует для отображения и быстрой перерисовки контрола на экране. При анимации движении элемента, его размер и внешний вид не будут изменяться, следовательно будет просто копирование bitmap кеша в нужную область экрана.
Использовать все прелести виртуализации, при необходимости создавать свои собственные панели компоновки поддерживающие виртуализацию. Для этого стоит обратить внимание на абстрактный класс VirtualizationPanel и интерфейс IScrollInfo.
Это довольно геморойная хрень, сделать свою вирт. панель очень не просто, при этом возникаем масса сложностей и недостатков такого подхода. Но он хорошо окупается, если большая часть элементов управления находится в не области видимости.

Советую почитать про наследование Visual, работа с этим базовым классом сильно отличается от Control

опишите, более подробно, если не секрет, что вы пытаетесь делать
...
Рейтинг: 0 / 0
GUI тормозит
    #39025518
BugzzBunny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Биндинг с задержкой это всё же не то, что мне надо.


Roman Mejtes,

спасибо, учту.

Вообще, я уже решил свою проблему - у меня тормозило потому, что я, как я понял, забивал очередь команд на перерисовку слишком частыми изменениями значений компонентов. Решил просто обновлять пореже - 60 кадров никому не надо, а 2-4 - вполне достаточно.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / GUI тормозит
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]