|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
15.10.2015, 22:47 | #1 |
Форумчанин
Регистрация: 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 (за исключением аппаратных решений, типа "купи видюху мощнее" - у меня и так железо не слабое). Заранее спасибо всем откликнувшимся! |
16.10.2015, 13:13 | #2 |
Форумчанин
Регистрация: 27.01.2014
Сообщений: 115
|
По логике вещей, в вашем приложении должно прослеживаться следующее:
Есть память, выделенная для хранения данных координат объектов (ваших частиц), с которыми работает ЦП обрабатывая расчеты моделирования. Есть ГП, который их отрисовывает и в момент отрисовки он должен по-хорошему просто перерисовать некоторую область экрана. Для отрисовки частиц вы ему выдаете объекты в памяти привязанные к StoryBoard. Расположение объектов на некотором участке контрола определяется связью с памятью, выделенной для расчетов. Т.е. имеется некоторая функция, переводящая мировые координаты в экранные, отражающая взаимосвязь координат объектов сторибоарда и объектов с которыми работает модель. Соответственно, модель рассчитывается в своем потоке на ЦП, графика отрисовывается на карте и единственное место где всё это пересекается - некоторое событие по которому производится обновление координат объектов сторибоарда. Опять же это обновление может не использовать функцию перевода мировых координат в экранные, а только брать данные. Поэтому, если честно, мне не совсем понятно зачем вы регулярно очищаете Children StoryBoard? Могу показаться странным, с тонкостями реализации графики StoryBoard я не знаком, но я бы решал задачу обновления координат и перерерисовки, а не полного удаления всех объектов отрисовки с тем, чтобы их снова добавить. Помимо этого момента есть кэширование изображений. Вы им пользуетесь? |
25.10.2015, 00:15 | #3 | |
Форумчанин
Регистрация: 14.10.2009
Сообщений: 128
|
Цитата:
Вариант конечно хороший, но такое количество графики не хочется держать в памяти видеокарты. Второстепенной целью является сделать не особо нагрузочное ПО. Проблема чистично решилась при динамическом создании StoryBoard на каждую анимацию и последующем уничтожении StoryBoard = null. Ну и убрал принудительные сборщики мусора, по наблюдению - их вызов вызвал в этот момент подтормаживание всей программы. В принципе со временем автоматический сборщик мусора, как и должен срабатывал. Итог: количество объектов анимации с нормальным качеством увеличилось в 4 раза. Последний раз редактировалось Dj_SheLL; 25.10.2015 в 11:05. Причина: Добавил |
|
05.11.2015, 10:38 | #4 |
Форумчанин
Регистрация: 14.10.2009
Сообщений: 128
|
В общем итоге без тормозов на экране 3840х1200 анимируется около 1000 объектов размером 100х100 пкс. одновременно.
Где вообще можно почитать о правильной организации анимации? На msdn-е только в общих чертах. Не описано, как правильно делать для достижения высокой производительности. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |