|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Тормоза таймера при высоких частотах повторений
Для представления проблемы приведу следующий пример:
import flash.events.TimerEvent; var mySeconds:int = 0; var firstTime:Number = 0; var myDate:Date = new Date(); var myTimer:Timer = new Timer(10, 200); myTimer.addEventListener(TimerEvent.TIMER, onTimer); myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); myTimer.start(); trace("Timer Start", myDate.getSeconds()); function onTimer(e:TimerEvent):void { myDate = new Date(); mySeconds += 10; trace(mySeconds); } function onTimerComplete(e:TimerEvent):void { var curTime:Number = myDate.getSeconds() - firstTime; trace("Timer Complete", curTime); } |
|
|||||
Universe, да есть такая трабла, так же как и c setInterval. Потому лучше использовать свой обработчик к примеру на ENTER_FRAME проверяющий время.
Проверил setTimeout, тот же результат. Добавлено через 23 минуты setTimeout import flash.utils.setTimeout; var time:Number = -10; var startTime:Number = new Date().time; var timeLast:Number = 0; timeEvent(); function timeEvent():void { time += 10; var colaps:Number = new Date().time-startTime; var realTime:Number = Math.floor(colaps/100)/10; if (Math.floor(realTime)!=timeLast) { timeLast = Math.floor(realTime); trace('setTimeout: '+Math.floor(time/100)/10+' RealTime: '+realTime); } setTimeout( timeOut, 10 ); } setTimeout: 0.4 RealTime: 1 setTimeout: 0.9 RealTime: 2 setTimeout: 1.4 RealTime: 3 setTimeout: 1.8 RealTime: 4 setTimeout: 2.3 RealTime: 5 setTimeout: 2.8 RealTime: 6 setTimeout: 3.3 RealTime: 7 setTimeout: 3.8 RealTime: 8 setTimeout: 4.2 RealTime: 9 setTimeout: 4.7 RealTime: 10 import flash.utils.setInterval; var time:Number = -10; var startTime:Number = new Date().time; var timeLast:Number = 0; setInterval( timeEvent, 10 ); timeEvent(); function timeEvent(event:*=null):void { time += 10; var colaps:Number = new Date().time-startTime; var realTime:Number = Math.floor(colaps/100)/10; if (Math.floor(realTime)!=timeLast) { timeLast = Math.floor(realTime); trace('setInterval: '+Math.floor(time/100)/10+' RealTime: '+realTime); } }
__________________
return this... Последний раз редактировалось AlexCooper; 13.09.2013 в 16:36. |
|
|||||
а чем это вызвано?
|
|
|||||
Честно говоря Я не знаю, особенно проявляется на малых интервалах. Стыкался когда-то с подобным, делал таймер обратного отсчёта на Timer'e, а в результате получил вообще интересную штуку. Таймер сначало быстро отсчитывал, а со временем замедлялся и приближался к реальному времени. Для глаз это выглядело как будто время с фейдином шло, потому переписал привязавши к new Date().time
__________________
return this... |
|
|||||
Регистрация: Jun 2013
Сообщений: 133
|
Цитата из справочника по ActionScript 3.0
Цитата:
|
|
|||||
В справке про таймер написано о возможных расхождениях во времени. То-есть таймер не гарантирует строго указанную ему точность выполнения. Он стремится к ней, но в реале сказываются факторы производительности и сложности вычислений.
Там-же чуть ниже написано: Цитата:
__________________
Дети не должны знать о своих родителях |
|
|||||
Причем при использовании даже 100мс дает погрешность
import flash.events.TimerEvent; var mySeconds:int = 0; var firstTime:Number = new Date().time; var myDate:Date = new Date(); var myTimer:Timer = new Timer(100,100); myTimer.addEventListener(TimerEvent.TIMER, onTimer); myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); myTimer.start(); var time:Number = 0; function onTimer(e:TimerEvent):void { time+=100; trace(time+" <> "+(new Date().time-firstTime)); } // TimerTime <> RealTime 100 <> 110 200 <> 235 300 <> 360 400 <> 485 500 <> 610 600 <> 735 700 <> 860 800 <> 985 900 <> 1204 1000 <> 1329 1100 <> 1438 1200 <> 1579 1300 <> 1688 1400 <> 1829 1500 <> 1938 1600 <> 2079 1700 <> 2188 1800 <> 2329 1900 <> 2438 2000 <> 2579 2100 <> 2688 2200 <> 2829 2300 <> 2938 2400 <> 3079 2500 <> 3188 2600 <> 3329 2700 <> 3438 2800 <> 3579 2900 <> 3688 3000 <> 3829 3100 <> 3938 3200 <> 4079 3300 <> 4188 3400 <> 4329 3500 <> 4438 3600 <> 4579 3700 <> 4688 3800 <> 4829 3900 <> 4938 4000 <> 5079 4100 <> 5188 4200 <> 5329 4300 <> 5438 4400 <> 5579 4500 <> 5688 4600 <> 5829 4700 <> 5938 4800 <> 6079 4900 <> 6188 5000 <> 6329 5100 <> 6438 5200 <> 6579 5300 <> 6688 5400 <> 6829 5500 <> 6938 5600 <> 7079 5700 <> 7188 5800 <> 7329 5900 <> 7438 6000 <> 7579 6100 <> 7688 6200 <> 7829 6300 <> 7938 6400 <> 8079 6500 <> 8188 6600 <> 8329 6700 <> 8438 6800 <> 8579 6900 <> 8688 7000 <> 8829 7100 <> 8938 7200 <> 9079 7300 <> 9188 7400 <> 9329 7500 <> 9438 7600 <> 9579 7700 <> 9688 7800 <> 9829 7900 <> 9938 8000 <> 10079 8100 <> 10188 8200 <> 10329 8300 <> 10438 8400 <> 10579 8500 <> 10688 8600 <> 10829 8700 <> 10938 8800 <> 11079 8900 <> 11188 9000 <> 11329 9100 <> 11438 9200 <> 11579 9300 <> 11688 9400 <> 11829 9500 <> 11938 9600 <> 12079 9700 <> 12188 9800 <> 12329 9900 <> 12438 10000 <> 12579 и 300мс только 500мс таймер дает верные значения и то как писал Tails всё это еще нужно налаживать на аппаратную часть
__________________
return this... |
|
|||||
AlexCooper,
Вы 10 раз в секунду создаёте новый экземпляр Date и вызываете его геттер. Для получения прошедшего времени просто дёргайте функцию getTimer() из пакета: flash.utils
__________________
Дети не должны знать о своих родителях |
|
|||||
Цитата:
p.s. Но это уже другая история)
__________________
return this... |
Часовой пояс GMT +4, время: 19:55. |
|
« Предыдущая тема | Следующая тема » |
|
|