|
GUI тормозит
|
|||
---|---|---|---|
#18+
WPF. Обычно пишут, что если GUI тормозит, то надо считать не в потоке GUI. А что, если я считаю в другом потоке, и обновляю GUI тоже в другом потоке через Dispatcher, но логика обновления настолько интенсивная (много контролов обновляются, плюс это часто и циклически происходит), что GUI всё равно тормозит? А мне надо, чтобы были всегда активны некоторые другие контролы, типа отмены задания и прочие. А получается, что если нажать на отмену, то оно не сразу срабатывает, т. к. поток GUI занят перерисовкой. Можно ли как-то для некоторых контролов выделить более высокий приоритет, чем для других? Т. е. чтобы даже если идёт интенсивная перерисовка одних контролов, то всегда какая-нибудь другая кнопка "Отмена" работала сразу, а не ждала, когда там другие контролы перерисуются? Как другой вариант, придумал пока делать паузы (через Thread.Sleep) в итерациях обновления GUI, чтобы дать возможность обработать нажатие кнопки "Отмена". Но это кажется неоптимальным решением. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2015, 07:47 |
|
GUI тормозит
|
|||
---|---|---|---|
#18+
BugzzBunny... но логика обновления настолько интенсивная (много контролов обновляются, плюс это часто и циклически происходит), что GUI всё равно тормозит?Пользователю нужно такое интенсивное обновление? Как вариант - обновлять данные в контролах по таймеру, например, раз в 1 секунду. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2015, 08:00 |
|
GUI тормозит
|
|||
---|---|---|---|
#18+
Алексей КBugzzBunny... но логика обновления настолько интенсивная (много контролов обновляются, плюс это часто и циклически происходит), что GUI всё равно тормозит?Пользователю нужно такое интенсивное обновление? Как вариант - обновлять данные в контролах по таймеру, например, раз в 1 секунду. Ну я примерно так и думал - дать возможность потоку GUI закончить перерисовки и подождать - принять хоть какое-то управление от пользователя. Т. е. с разными приоритетами для разных контролов идей в WPF нет? А то может быть так, что даже если раз в 1 секунду - перерисовка дольше 1 секунды может идти (например, забилась очередь команд на перерисовку - пока она не выполнилась, нажатие кнопок и прочее обрабатываться не будет). ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2015, 08:59 |
|
GUI тормозит
|
|||
---|---|---|---|
#18+
BugzzBunnyАлексей Кпропущено... Пользователю нужно такое интенсивное обновление? Как вариант - обновлять данные в контролах по таймеру, например, раз в 1 секунду. Ну я примерно так и думал - дать возможность потоку GUI закончить перерисовки и подождать - принять хоть какое-то управление от пользователя. Т. е. с разными приоритетами для разных контролов идей в WPF нет?Там в новом WPF можно делать биндинг с задержкой , это тоже вполне разумный вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2015, 09:02 |
|
GUI тормозит
|
|||
---|---|---|---|
#18+
Алексей КBugzzBunnyпропущено... Ну я примерно так и думал - дать возможность потоку GUI закончить перерисовки и подождать - принять хоть какое-то управление от пользователя. Т. е. с разными приоритетами для разных контролов идей в WPF нет?Там в новом WPF можно делать биндинг с задержкой , это тоже вполне разумный вариант. Спасибо, посмотрю. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2015, 11:26 |
|
GUI тормозит
|
|||
---|---|---|---|
#18+
важно учитывать, что ресурсы расходуются не только на прорисовку, но и на компановку элементов управления. Проще говоря, нужно как следую продумать компоновку, чтоб изменение 1 контрола, не влияло на пересчет компоновки всех остальных. При обновлении визуальных контролов делать это 30-60 раз в секунды по меньше мере глупо, но если такая задача все же необходима (для создания качественной анимации с высокой частотой кадров и минимальной нагрузкой), то необходимо использовать элементы интерфейса наследованные от Visual, а не от Control. Вообще все элементы управления имеющие визуальное представление наследованны либо от Visual для 2D, либо от Visual3D. Есть количество элементов на экране большое, а их обновление занимает много времени (для прорисовки), то это самый лучший вариант. При этом, стоит подумать над тем, что лучше, заменить кучу контролов на 1 (который будет их всех прориросывать), либо декомпозировать и объединить. Так же, необходимо стремиться к тому, чтоб визуальное дерево не было слишком большим, чем более глубокое дерево, тем больше ресурсов будет уходить на маршутизируемые события, команды, компоновку (OverrideMeasure, OverrideArrange), относительное связывание, поиск элементов в дереве и т.д., так как вызов пересчета компоновки корневых элементов будет вызывать практически полные пересчет всех вложенных. Так же для повышения производительности стоит почитать про bitmap кеширование. После того, как визуальный объект был сформирован (определен его размер и нарисован) его внешний вид сохраняет в bitmap кеш, который использует для отображения и быстрой перерисовки контрола на экране. При анимации движении элемента, его размер и внешний вид не будут изменяться, следовательно будет просто копирование bitmap кеша в нужную область экрана. Использовать все прелести виртуализации, при необходимости создавать свои собственные панели компоновки поддерживающие виртуализацию. Для этого стоит обратить внимание на абстрактный класс VirtualizationPanel и интерфейс IScrollInfo. Это довольно геморойная хрень, сделать свою вирт. панель очень не просто, при этом возникаем масса сложностей и недостатков такого подхода. Но он хорошо окупается, если большая часть элементов управления находится в не области видимости. Советую почитать про наследование Visual, работа с этим базовым классом сильно отличается от Control опишите, более подробно, если не секрет, что вы пытаетесь делать ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2015, 11:58 |
|
GUI тормозит
|
|||
---|---|---|---|
#18+
Биндинг с задержкой это всё же не то, что мне надо. Roman Mejtes, спасибо, учту. Вообще, я уже решил свою проблему - у меня тормозило потому, что я, как я понял, забивал очередь команд на перерисовку слишком частыми изменениями значений компонентов. Решил просто обновлять пореже - 60 кадров никому не надо, а 2-4 - вполне достаточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2015, 14:25 |
|
|
start [/forum/search_topic.php?author=caro1223&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
131ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 988ms |
total: | 1224ms |
0 / 0 |