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

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

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

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

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

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

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

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

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

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

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

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


Roman Mejtes,

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

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


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