Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2015, 22:47   #1
Dj_SheLL
Форумчанин
 
Аватар для Dj_SheLL
 
Регистрация: 14.10.2009
Сообщений: 128
Вопрос [WPF][C#] Одновременная анимация 100-а и больше объектов

Добрый вечер, уважаемые форумчане!
Наконец-то решил задать вопрос, на который так и не нашёл ответа.
Как максимально повысить производительность анимации одновременно 100-а и более объектов на форме.

Вводная:
Вы наверняка спросите - каких объектов может быть так много и для чего это нужно? Я отвечу - к примеру много много Image для моделирования поведения частиц (атомов, электронов), допустим в физике.
Анимация простейшая - ThicknessAnimation, объекты перемещаются по полю формы. Объекты не нагружены ни какими эффектами, типа теней, кистей и т.п. и т.д.

Как я это делал:
Изначально я создавал диспатчер таймер, в котором "дёргал" случайным образом выбранный Image на предмет - свободен контрол или "анимирует". Если свободен, то я динамически создавал анимацию, вкладывал её в единственный StoryBoard и по циклу шёл к следующем случайно выбранному Image. И так через каждые 800-1000 милисекунд.
Для малого количества объектов работало. Для более 100 - начинались тормоза.
Анимация на двух мониторах, суммарное разрешение 1200х3840.

Что я сделал, чтобы хоть как-то увеличить производительность:
1. Добавил GC.Collect после каждого цикла таймера.
2. Очищал Children StoryBoard-а после каждого цикла таймера.
3. Снизил FPS до 30 кадров в секунду, почти без ущерба на качество
4. Добавил вспомогательные Storyboard, чтобы группы анимаций выполнялись не в одной таймлайне и не грузили контейнер StoryBoard в одном потоке.

Результат:
- Как результат - количество одновременно анимированных элементов увеличилось до 100 без потери производительности
- Качество упало не значительно (30 FPS)
- При большем количестве элементов, задействованных в анимации, появляются заметные тормоза.

Итог: хотелось бы, пожалуйста, советов, мыслей, размышлений, догадок, как можно МАКСИМАЛЬНО возможно повысить производительность анимации в WPF (за исключением аппаратных решений, типа "купи видюху мощнее" - у меня и так железо не слабое).
Заранее спасибо всем откликнувшимся!
Dj_SheLL вне форума Ответить с цитированием
Старый 16.10.2015, 13:13   #2
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

По логике вещей, в вашем приложении должно прослеживаться следующее:
Есть память, выделенная для хранения данных координат объектов (ваших частиц), с которыми работает ЦП обрабатывая расчеты моделирования.
Есть ГП, который их отрисовывает и в момент отрисовки он должен по-хорошему просто перерисовать некоторую область экрана. Для отрисовки частиц вы ему выдаете объекты в памяти привязанные к StoryBoard. Расположение объектов на некотором участке контрола определяется связью с памятью, выделенной для расчетов.
Т.е. имеется некоторая функция, переводящая мировые координаты в экранные, отражающая взаимосвязь координат объектов сторибоарда и объектов с которыми работает модель.

Соответственно, модель рассчитывается в своем потоке на ЦП, графика отрисовывается на карте и единственное место где всё это пересекается - некоторое событие по которому производится обновление координат объектов сторибоарда.
Опять же это обновление может не использовать функцию перевода мировых координат в экранные, а только брать данные.

Поэтому, если честно, мне не совсем понятно зачем вы регулярно очищаете Children StoryBoard? Могу показаться странным, с тонкостями реализации графики StoryBoard я не знаком, но я бы решал задачу обновления координат и перерерисовки, а не полного удаления всех объектов отрисовки с тем, чтобы их снова добавить.

Помимо этого момента есть кэширование изображений. Вы им пользуетесь?
Akeloya вне форума Ответить с цитированием
Старый 25.10.2015, 00:15   #3
Dj_SheLL
Форумчанин
 
Аватар для Dj_SheLL
 
Регистрация: 14.10.2009
Сообщений: 128
По умолчанию

Цитата:
Сообщение от Akeloya Посмотреть сообщение
Поэтому, если честно, мне не совсем понятно зачем вы регулярно очищаете Children StoryBoard? Могу показаться странным, с тонкостями реализации графики StoryBoard я не знаком, но я бы решал задачу обновления координат и перерерисовки, а не полного удаления всех объектов отрисовки с тем, чтобы их снова добавить.
Регулярно очищал, я потому что как раз снова добраться до объектов анимации в StoryBoard проблематично. И тем более этих объектов там предостаточно. И нужно было следить какой объект в StoryBoard закончил анимацию, а какой нет. Потому что у всех время анимации было случайной величиной.

Цитата:
Сообщение от Akeloya Посмотреть сообщение
Помимо этого момента есть кэширование изображений. Вы им пользуетесь?
Вариант конечно хороший, но такое количество графики не хочется держать в памяти видеокарты. Второстепенной целью является сделать не особо нагрузочное ПО.

Проблема чистично решилась при динамическом создании StoryBoard на каждую анимацию и последующем уничтожении StoryBoard = null.

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

Итог: количество объектов анимации с нормальным качеством увеличилось в 4 раза.

Последний раз редактировалось Dj_SheLL; 25.10.2015 в 11:05. Причина: Добавил
Dj_SheLL вне форума Ответить с цитированием
Старый 05.11.2015, 10:38   #4
Dj_SheLL
Форумчанин
 
Аватар для Dj_SheLL
 
Регистрация: 14.10.2009
Сообщений: 128
По умолчанию

В общем итоге без тормозов на экране 3840х1200 анимируется около 1000 объектов размером 100х100 пкс. одновременно.
Где вообще можно почитать о правильной организации анимации? На msdn-е только в общих чертах. Не описано, как правильно делать для достижения высокой производительности.
Dj_SheLL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c# WPF анимация для ListboxItem crawter WPF, UWP, WinRT, XAML 1 30.12.2012 17:24
Анимация и вращение объектов Nedward Общие вопросы по Java, Java SE, Kotlin 0 24.05.2012 15:36
WPF анимация(поворот и движение) olya30 WPF, UWP, WinRT, XAML 0 08.12.2011 23:55
Где найти исходники на Java( 1 проект - больше 1000 классов, 2 проект - больше 100, 3 проект - больше 10) Pti44ka Общие вопросы по Java, Java SE, Kotlin 2 09.09.2010 21:31
Анимация объектов ? HWork Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 11.03.2010 22:22