Просмотр полной версии : частота выполнения по EnterFrame... кратность
например, есть код, который выполняется 1 раз в 2 кадра
_delay = 0;
}
private function onStartBlinkingOnEnterFrame(e:Event):void
{
_delay ++;
if (_delay == 2){ // тут код моргания...
т.е. этот код будет каждые 2 кадра вызываться... если поставить _delay == 1, то будет каждый кадр... проблема в том, что каждый кадр - это слишком быстро, а каждые 2 кадра - это слишком медленно. Как сделать, чтобы как будто раз в 1.5 кадра вызывалось? может можно как-нибудь поменять fps самого Sprita, не меняя fps всего Stage?
caseyryan
24.02.2018, 10:48
Как раз про твою проблему https://www.youtube.com/watch?v=zr3YuhgpuYg
Если надо что-то выполнять через определенные промежутки времени, используй таймер
таймер до этого стоял... на 45мс, но он глючит (иногда быстрее-медленнее на момент становится), не совсем с одинаковыми промежутками срабатывает... видимо из-за того, что сильно часто. Поменял на EnterFrame - стало равномерно, но теперь не могу подогнать скорость до нужной по EnterFrame... получается, что отдельно у каждого DisplayObjecta нельзя менять скорость кадров?
undefined
24.02.2018, 19:11
таймер то тикает равномерно просто флэш скорее всего не успевает обновить экран из-за низкого fps.
Если таймер тикает раз в 45 ms, то fps должен быть не меньше 23(1000/45).А лучше брать с запасом 30+
олучается, что отдельно у каждого DisplayObjecta нельзя менять скорость кадров?
нет конечно, fps задается глобально для всей флэшки.
Вообще завязываться на enterframe дурная практика т.к. в зависимости от нагрузки он может тикать сильно медленнее заявленного fps.
caseyryan
24.02.2018, 19:52
таймер до этого стоял... на 45мс, но он глючит (иногда быстрее-медленнее на момент становится), не совсем с одинаковыми промежутками срабатывает... видимо из-за того, что сильно часто. Поменял на EnterFrame - стало равномерно, но теперь не могу подогнать скорость до нужной по EnterFrame... получается, что отдельно у каждого DisplayObjecta нельзя менять скорость кадров?
45 это не слишком часто. У TimerEvent можно вызывать метод updateAfterEvent() в обработчике. Это вынудит флеш плеер перерисовать всю картинку по событию. Тогда все будет работать плавно
private function onTimer(e:TimerEvent):void {
e.updateAfterEvent();
}
Вообще завязываться на enterframe дурная практика т.к. в зависимости от нагрузки он может тикать сильно медленнее заявленного fps.
А ты бы какое решение предложил? Во флеше даже таймер зависит от FPS. Поток то один, никуда от этого не денешься.
Завязываться на EnterFrame это не дурная практика, а самая обычная, используемая везде. Единственное, что нужно усорвешенствовать обновление по EnterFrame и добавить замер длительности предыдущего кадра (delta time), и все расчеты производить с учетом этой величины
undefined
24.02.2018, 20:16
А ты бы какое решение предложил?
tween=new Tween(null,"",None.easeNone,0,1,0.3,true);
tween.addEventListener(TweenEvent.MOTION_CHANGE,update);
tween.start();
private function update(e:TweenEvent):void {
// обновляем анимацию в зависимости от tween.position
if (tween.position==1) {
tween.stop();
tween.removeEventListener(TweenEvent.MOTION_CHANGE,update);
tween=null;
}
}
работает как часы
caseyryan
24.02.2018, 20:57
tween=new Tween(null,"",None.easeNone,0,1,0.3,true);
tween.addEventListener(TweenEvent.MOTION_CHANGE,update);
tween.start();
private function update(e:TweenEvent):void {
// обновляем анимацию в зависимости от tween.position
if (tween.position==1) {
tween.stop();
tween.removeEventListener(TweenEvent.MOTION_CHANGE,update);
tween=null;
}
}
работает как часы
Ты полагаешь, что твин не на энтер фрейме работает?
undefined
24.02.2018, 21:16
Ты полагаешь, что твин не на энтер фрейме работает?
хочешь сказать он втихаря подсовывает что-то на стейдж в надежде что никто его выкидыши не зачистит?
Привязывайся к прошедшему времени с последнего кадра. Так все делают (https://docs.unity3d.com/ScriptReference/Time-deltaTime.html).
caseyryan
26.02.2018, 15:39
хочешь сказать он втихаря подсовывает что-то на стейдж в надежде что никто его выкидыши не зачистит?
Не понял что ты хотел сказать. Зачем ему что-то подсовывать на стейдж? Во флеше всё обновление завязано на кадры. И события проходят тоже в кадрах. Тут и твины и таймеры зависят от FPS. Поэтому delta time это самое верное решение, и не придется городить никаких огородов
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.