Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.09.2013, 16:00
Universe вне форума Посмотреть профиль Отправить личное сообщение для Universe Найти все сообщения от Universe
  № 1  
Ответить с цитированием
Universe
 
Аватар для Universe

Регистрация: Feb 2010
Сообщений: 811
Отправить сообщение для Universe с помощью ICQ Отправить сообщение для Universe с помощью Skype™
Arrow Тормоза таймера при высоких частотах повторений

Для представления проблемы приведу следующий пример:
Код AS3:
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);
}
Пример выше выполняет обычный трейс за отведённое время, т.е. раз в 10 милисекунд, 200 раз. Если посчитать, в секундах, выполнение таймера должно завершиться через 2 сек. Однако это время растягивается до 4 сек, я уже не говорю какая разница во времени будет, если поставить например 2000 раз, раз в милисекунду. Вопрос знатокам: изза чего происходит такой разбег по времени?

Старый 13.09.2013, 16:08
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 2  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Universe, да есть такая трабла, так же как и c setInterval. Потому лучше использовать свой обработчик к примеру на ENTER_FRAME проверяющий время.
Возможно попробуйте setTimeout
Проверил setTimeout, тот же результат.

Добавлено через 23 минуты
setTimeout
Код AS3:
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
setInterval
Код AS3:
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);
	}
 
}
Код:
setInterval: 0.4 RealTime: 1
setInterval: 0.9 RealTime: 2
setInterval: 1.4 RealTime: 3
setInterval: 1.8 RealTime: 4
setInterval: 2.3 RealTime: 5
setInterval: 2.8 RealTime: 6
setInterval: 3.3 RealTime: 7
setInterval: 3.8 RealTime: 8
setInterval: 4.2 RealTime: 9
setInterval: 4.7 RealTime: 10
__________________
return this...


Последний раз редактировалось AlexCooper; 13.09.2013 в 16:36.
Старый 13.09.2013, 16:34
Universe вне форума Посмотреть профиль Отправить личное сообщение для Universe Найти все сообщения от Universe
  № 3  
Ответить с цитированием
Universe
 
Аватар для Universe

Регистрация: Feb 2010
Сообщений: 811
Отправить сообщение для Universe с помощью ICQ Отправить сообщение для Universe с помощью Skype™
а чем это вызвано?

Старый 13.09.2013, 16:47
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 4  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от Universe Посмотреть сообщение
а чем это вызвано?
Честно говоря Я не знаю, особенно проявляется на малых интервалах. Стыкался когда-то с подобным, делал таймер обратного отсчёта на Timer'e, а в результате получил вообще интересную штуку. Таймер сначало быстро отсчитывал, а со временем замедлялся и приближался к реальному времени. Для глаз это выглядело как будто время с фейдином шло, потому переписал привязавши к new Date().time
__________________
return this...

Старый 13.09.2013, 16:50
Rivexe вне форума Посмотреть профиль Отправить личное сообщение для Rivexe Найти все сообщения от Rivexe
  № 5  
Ответить с цитированием
Rivexe
 
Аватар для Rivexe

Регистрация: Jun 2013
Сообщений: 133
Цитата из справочника по ActionScript 3.0
Цитата:
delay
...
Примечание. Не рекомендуется задавать свойству delay значение меньше 20 миллисекунд. Частота объекта Timer ограничена 60 кадрами в секунду, то есть задержка меньше 16,6 миллисекунд вызывает проблемы во время выполнения.

Старый 13.09.2013, 16:55
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 6  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от Rivexe Посмотреть сообщение
Цитата из справочника по ActionScript 3.0
Интересно что в справочнике только для Timer написали поправку.
__________________
return this...

Старый 13.09.2013, 16:57
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 7  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
В справке про таймер написано о возможных расхождениях во времени. То-есть таймер не гарантирует строго указанную ему точность выполнения. Он стремится к ней, но в реале сказываются факторы производительности и сложности вычислений.
Там-же чуть ниже написано:
Цитата:
delay:Number — Задержка в миллисекундах между событиями таймера. Не рекомендуется задавать свойству delay значение меньше 20 миллисекунд. Частота объекта Timer ограничена 60 кадрами в секунду, то есть задержка меньше 16,6 миллисекунд вызывает проблемы во время выполнения.
Если нужна безукоризненная точность, используйте метод getTimer() для получения прошедшего времени. Рассчитывайте состояние программы или шага анимации на основе прошедшего времени.
__________________
Дети не должны знать о своих родителях

Старый 13.09.2013, 17:26
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 8  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Причем при использовании даже 100мс дает погрешность
Код AS3:
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
Добавлено через 4 минуты
и 300мс
Код:
30000 <> 33281
только 500мс таймер дает верные значения
Код:
500 <> 500
1000 <> 1000
1500 <> 1500
2000 <> 2000
2500 <> 2500
3000 <> 3000
3500 <> 3500
4000 <> 4000
4500 <> 4500
5000 <> 5000
5500 <> 5500
6000 <> 6000
6500 <> 6500
7000 <> 7000
7500 <> 7500
8000 <> 8000
8500 <> 8500
9000 <> 9000
9500 <> 9500
10000 <> 10000
и то как писал Tails всё это еще нужно налаживать на аппаратную часть
__________________
return this...

Старый 13.09.2013, 17:30
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 9  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
AlexCooper,
Вы 10 раз в секунду создаёте новый экземпляр Date и вызываете его геттер.
Для получения прошедшего времени просто дёргайте функцию getTimer() из пакета: flash.utils
__________________
Дети не должны знать о своих родителях

Старый 13.09.2013, 17:32
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 10  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от Tails Посмотреть сообщение
AlexCooper,
Вы 10 раз в секунду создаёте новый экземпляр Date и вызываете его геттер.
Для получения прошедшего времени просто дёргайте функцию getTimer() из пакета: flash.utils
согласен что getTimer() будет работать быстрее.
p.s. Но это уже другая история)
__________________
return this...

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:55.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 19:55.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.