![]() |
|
||||||||||
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Со вчерашнего дня не получается сделать и сегодня я уже думаю, что не допонял чего то.
В advanceTime передаются значения Цитата:
public function advanceTime(time:Number):void { //суммарное прошедшее время _passedTime += time; var balance:Number = 0; //проверяю, если суммарное время больше либо равно //_refreshRate ( _refreshRate - это сикунда поделённая на кол-во кадров ) if (_passedTime >= _refreshRate) { //вычитаю взятое время из суммарного balance = _passedTime-_refreshRate; //вычитаю это из суммарного времени _passedTime -= balance; //передаю время во все методы for (var index:int = 0; index < _length; index++) { _animates[index].advanceTime(_refreshRate); } } //и вот здесь проблема. я понимаю так - если произошёл лаг //то этот метод не кто не вызовет, а значит лаги передадутся на анимацию //по этому я возвращаю это значение в этот же метод //но именно из-за этой рекурсии всё и отваливается. //где я не правильно понял? if (balance) this.advanceTime(balance); } |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Что такое "взятое" время? Почему "взятое" это "сикунда поделённая на кол-во кадров"? Вообще не понимаю, как и раньше, что Вы делаете. По сути Вы просто всем отдаете это самое предрасчетное время на один кадр — и _animates[index] и this получают просто _refreshRate.
__________________
Reality.getBounds(this); |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
Цитата:
Цитата:
Тут я писал и переписывал три раза и наконец я понял предназначение этого подхода. я ждал от него плавного течения времени, а он создан для того, чтобы обьект из точки А в точку Б дошел за точное время. Добавлено через 15 минут Но! я сам уже сбился Слова Цитата:
Потому что, если мне нужно менять положение обьекта в зависимости от времени, то получится следующее и пока лагов нет, то его движение можно назвать равномерным. Но тут происходит лаг и время не приходит, а обьект застывает. Потом приходит сразу много времени и обьект перепрыгивает через это время и выглядеть это будет, как лаг. Если выдавать это время частями, то цель этого мероприятия - из А в Б за секунду, то же теряется. Где я не пойму чего то? |
|
|||||
|
Цитата:
Это называется анимация, основанная на времени. пс. Прибавлять нужно не само время, а время * скорость. Скорость задаётся как расстояние, проходимое за 1 секунду. (Тут передаваемое время служит не только как показатель конкретно прошедшего времени, но и как математический коэффициент для нахождения изменения состояния. Это очень простая вещь, но может быть, немного сложная для начального понимания.) пс.2 Если вам нужна плавная анимация, передавайте в advanceTime фиксированное значение, например: 1/60, если у вас фремрейт == 60. Однако, при таком способе, анимация будет закономерно замедляться вместе с лагами.
__________________
Дети не должны знать о своих родителях Последний раз редактировалось Tails; 02.11.2013 в 18:26. |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Tails Спасибо! Скорость у меня есть, я её не написал, так как смотрел на движение скорости по умолчанию.
Цитата:
Цитата:
то сам метод advanceTime перестанет вызываться и всё встанет, хоть запас времени и будет. По этому я и делаю рекурсию, если есть время, то лаги не страшны, метод сам себя будет вызывать. Но происходит завал плеера и по этому я и спросил - как это решить. я не боюсь коэффициентов, я просто не пойму, как это реализовать. Добавлено через 7 минут Может нужно для равномерности написать какой то замедлитель или возможно есть, алгоритм равномерного распределения. Если так, то скажите правильное название. я просто пытаюсь сделать "что то", что заменит для всего приложения EnterFrame и позволит работать без тырчков. |
|
|||||
|
Дёрганье - это низкий фпс. А низкий фпс вы никаким образом не поднимите, пока не купите нормальный компьютер. (Или не произведёте оптимизацию для его повышения. пс. Здесь, конечно, можно придумать какой-то алгоритм, который будет стараться сгладить большую разность во времени между тиками. Этот механизм должен находиться на самом верху в ядре, в котором происходит первичное уведомление главного juggler. В старлинге, такого механизма нету. Готового решения я не искал. Разработка такого механизма должна быть не слишком сложная, может максимум - 1 день.)
Это два способа анимации:
Иногда нужно, что-бы анимация проигрывалась с точно указанной скоростью, независимо от fps - 1 способ. Когда точная скорость анимации не важна, или нужна обязательно плавная анимация без лишнего гемора - 2 способ. (Однако длительность анимации будет возрастать, при понижений fps) Цитата:
Если мы возьмём некоторый параметр как значение/секунду (значение в секунду), то мы сможем рассчитать конкретное изменение этого параметра: параметр * переданный коэффициент. Пример:
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Вот, я еще тогда заподозрил, что Вы что-то не то придумали про эту технологию, когда прозвучал какой-то очень странный вопрос типа "как мне значение 0.2 поможет рассчитать сколько кадров займет движение из А в В".
Анимация по времени вообще не занимается плавностью, скорее даже наоборот — она рассчитывает, насколько надо скакнуть анимации, чтобы придти в нужную фазу в нужное время, и предназначена как раз не для сглаживания скачков, а для того, чтобы скачки не рассинхронизировали течения анимаций. Она гарантирует, что анимация с предрасчетным временем 1.5 сек закончится через 1.5 сек, даже если ей придется показать только начальную и конечную фазу. А "плавность" анимации это абсолютно другая задача, и она в принципе не решается при низком фпс или его скачках. Никак. Это технически невозможно — если экран полсекунды не обновлялся из-за тормозов системы, то скачок будет и ничем его не смажешь. Объект не может двигаться на экране, когда экран НЕ обновляется))
__________________
Reality.getBounds(this); |
|
|||||
|
Wolsh,
С разной степенью эффективности, скачки сгладить всё-же можно. Но в целом да, при рендере всего 2 кадров, мы увидим начальное и конечное состояние анимации.
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Для начала, наверное, надо определиться в терминологии: есть скачок и есть фриз.
Скачок это когда объект "вдруг" оказывается слишком далеко, то есть как будто скорость неожиданно возросла (и объект оказывается в нужной точке в нужное время, но, возможно, "в три прыжка" вместо двенадцати, то есть после фриза объект будет двигаться с бОльшей скоростью, чем задумано). Фриз это когда экран не обновляется, объекты на какое-то время застывают на месте, а затем продолжают двигаться дальше с той же скоростью (и оказываются в нужной точке позже чем планировалось, но будет показан каждый "кадр" анимации).
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:34. |
|
|
« Предыдущая тема | Следующая тема » |
|
|