• 0
Garrincha

Частота отображения анимации

Вопрос

Доброго времени суток.

Требовалось в мой проект добавить немного анимации чтобы пользователи не скучали. По такому случаю решил использовать TFloatAnimation FireMonkey т.к. все говорили что это просто и очень красиво получается. Но возникла проблема с количеством кадров в секунду.

Приведу конкретный пример.

Нужно на OnMouseEnter чтобы кнопка увеличивалась по высоте в 2 раза (с 25 до 50). Так вот, если на свойство Height повесить TFloatAnimation то за 0,5 секунды картинка обновится

на компе Celeron 2,2GHz 2Гб ОЗУ всего 2-3 раза 

на компе Intel i3 2,53Ghz 4 Гб ОЗУ быстрее где-то раза в 3, но все равно не так плавно как хотелось бы.

Но если я по-старинке напишу такой код на OnMouseEnter

while but.Height < 50 do begin
    but.Height := but.Height + 1;
    Application.ProcessMessages;
    sleep(5);
  end;

И аналогичное на OnMouseLeave то даже на первом менее мощном компьютере все очень быстро и красиво отрабатывает. Просто супер как отрабатывает.

Это нормально для FireMonkey? Неужели все программируют под хорошие, относительно мощные компьютеры, а на старом железе нормальную анимацию на FireMonkey не написать?

Все видео что я видел в интернете про анимацию в FireMonkey отличное, анимация правда хорошая. Это меня удивляет.

Нигде не нашел информацию о том на какою дельту изменяется свойство объекта в TFloatAnimation и как определяется задержка между кадрами. Может при установке RAD?

Может кто-то сталкивался и такой проблемой и решил ее?

 

Заранее благодарен.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

6 ответов на этот вопрос

  • 0

на сколько я понял: анимация тормозит только первый раз. потом работает плавно. и на телефонах, и на десктопах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

А что при этом показано на экране? Некоторые эффекты в FM ОЧЕНЬ СИЛЬНО затормаживают отрисовку. И это не только с анимацией. К примеру, у меня таймер, показывающий сотые доли секунды плавно и четко, еле показывал десятые доли при наложении на него эффекта тени или свечения и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

"при наложении на него эффекта тени или свечения и т.п. "

на НЕГО это на кого ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Простите, не совсем ясно выразился. Имеется в виду Label на весь экран, на котором отсчитываются минуты, секунды и сотые доли секунд. При наложении на лейбл эффекта начинались тормоза

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Добрый день,

  1. Вы можете поменять частоту срабатывания анимации. TAnimation.AniFrameRate отвечает за указания своей частоты срабатывания анимации. По умолчанию она равна 60 кадров в секунду. Значащие значения в диапазоне [5, 100]. Значения больше или меньше этого диапазона приводятся к нему же.
  2. Эффекты дорогостоящие операции. Поэтому их использование должно быть сведено к необходимому минимуму, особенно в анимации. В FireMonkey для ускорения эффектов, эффекты кешируются в контроле, к которому применяются. Однако, кэш не работает для анимации эффектов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

вот который месяц пишу проект, юзаю все эти фаирманковские "фичи" .....  и убедился в том, что именно использование фаирманки "должно быть сведено к необходимому минимуму"

aleksandrguru понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Вячеслав
      Всем добрый день. Как правильно переопределить родителя для аниматора и тем самым использовать один аниматор для нескольких объектов?
      Пытаюсь реализовать следующий принцип: на форме несколько прямоугольников и один аниматор. При клике по конкретному прямоугольнику он начинает менять координату. Вот чаcть кода:
      procedure TForm2.MoveRect(Rect: TRectangle); begin //задаем родителя для аниматора Rect.AddObject(AniMoveRect); //Анимируем координату Y прямоугольника AniMoveRect.PropertyName:='Position.Y'; AniMoveRect.Inverse:=False; AniMoveRect.StopValue:=0; AniMoveRect.Start; end; procedure TForm2.RectangleClick(Sender: TObject); begin MoveRect(Sender as TRectangle); end; В итоге анимируется только один прямоугольник - тот, на который кликнули в первый раз. Не могу понять, в чем проблема.
      Данную тему читал, но в ней, насколько я понял, речь идет об одновременном использовании аниматора для двух объектов. 
      AniRects.zip
    • Автор: estra
      Редактирую стиль, добавляю к нему компонент TImage и для свойства RotateAngle создаю FloatAnimation (параметры анимации на скрине). Но при запуске никакой анимации нет. Почему? И как все же добиться работоспособности анимации для элемента стиля?
    • Автор: Вячеслав
      Добрый день! Хочу заанимировать Lable таким образом, чтобы параметр Scale.X линейно увеличивался. Но при этом необходимо, чтобы центр компонента оставался на своем месте. А параметр Scale.X за начало отсчета принимает верхний левый угол лейбла. Есть ли возможность изменить центр масштабирования компонента? Я данную задачу уже решил путем добавления анимации смещения влево, но этот способ мне кажется топорным и неоптимальным.
    • Автор: antarey
      Придумал как реализовать эфект Анимация смены TabItem в TabControl , но есть вопрос - можно ли для двух объектов использовать один TFloatAnimation? или реализовывать через TTimer?
    • Автор: NesDmitrijj
      Здравствуйте!
       
      Как можно реализовать простой эффект плавного исчезновения текста (TLabel) с последующим его плавным появлением без глюков?
      Пример:
      Кидаю на форму Label Создаю FloatAnimation для свойства Opacity У FloatAnimation делаю StartValue = 1, StopValue = 0 Кидаю на форму кнопку и в OnClick пишу: FloatAnimation1.Start;
      Результат: При нажатии кнопки текст плавно исчезает и по завершению анимации текста не видно. У FloatAnimation делаю AutoReverse = true; Результат: При нажатии кнопки текст плавно исчезает, а затем плавно появляется. По завершению анимации текст виден. Но при повторном нажатии всё начинает глючить.
       
      Вопрос: как исправить?
    • Автор: Egorius
      Как запустить анимацию с кнопки для другого компонента?

      К примеру с Button  кликом запустить анимация для вызова например анимированного объекта Panel?
    • Автор: krapotkin
      TFloatAnimation использует ProcessMessages 
       
      Это чревато возникновением всяких событий, и даже закрытию формы во время анимации, что приводит к AV
      очень хочется иметь Repaint без ProcessMessages.
      Это возможно?
    • Автор: 97mik
      Как сделать эффект вспышки? То есть чтобы например Panel переходила из Opasity=0 в Opasity=1 и потом обратно, за 500мс..
    • Автор: 97mik
      В системе iOS есть несколько вариантов анимации выдвижных панелей, и вот один из них это когда панель выходит снизу экрана, как это можно сделать?
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу