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

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

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
По умолчанию Очень точный таймер

Вобщем... столкнулся с такой вот незадачей... нужен таймер, который бы работал на порядок точнее родного... Т.е. по тех характеристикам в течение 45 секунд должен тикать каждые 33 миллисекунды с погрешностью не более 6 миллисекунд (и при этом, желательно не сильно нагружать процессор)... Даже, не, скорее не так: нужно добиться, чтобы функция вызывалась точно по истечении 33 миллисекунд (само по себе выполнение функции примерно укладывается в это же время).
Что я уже попробовал:
- запускать таймер с минимальным интервалом. (эмпирическим путем выяснилось, что разницы между 1-6..8 миллисекунд практически нету. При вызове раз в 10 миллисекунд погрешность составляет примерно 6-15 миллисекунд (почти в 3 раза... млин =( ). Т.е. можно высчитывать дельту между ожидаемым временем тика и реальным, и немного постаравшись результаты примерно укладываются в +-6 мс, но тестится все в "тепличных условиях", боюсь, что на практике окажеться хуже...
- просто в цикле проверять текущее время, конечно, работает, но во время цикла все равно ничего не сделаешь %)

ЗЫ. сравнительные тесты сетИнтервала/сетТаймаута и Таймера - примерно одинаково, особой разницы не заметил.
ЗЫЫ. просто интересны варианты решения, мб есть что-нибудь, о чем не подумал.

ЗЫЫЫ. ессно, не нужно думать, что этим кто-то собирается пользоваться, но нужно добиться примерно похожих результатов...
Код:
package  
{
	
	/**
	* ...
	* @author wvxvw
	*/
	import flash.utils.getTimer;
	import flash.utils.setTimeout;
	
	public class PTimer 
	{
		
		private static var _pi:int = 0;
		private static var _s:int = 0;
		private static var _b:Boolean = true;
		private static var _d:int = 0;
		private static var _t:PTimer;
		
		public function PTimer() 
		{
			_t = this;
		}
		public static function start(interval:int, d:int = 0):void
		{
			if (!_pi) _pi = interval;
			_s = getTimer();
			if (!_d) _d = _s;
			var dt:int = _pi - (_s - _d) % _pi;
			pulse(dt);
		}
		public static function stop():void
		{
			_b = false;
			_pi = 0;
			_d = 0;
		}
		private static function pulse(dt:int):void
		{
			if (!_b) return;
			var i:int;
			var t:int = dt;
			for (i = 0; i >= 0; i++)
			{
				if (getTimer() - _s >= t) {
					//trace('timer: ' + getTimer());
					setTimeout(start, 1, t);
					break;
				}
			}
		}
	}
	
}
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 06.06.2008 в 05:02.
Старый 06.06.2008, 10:38
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
имхо гиблое дело, если речь о плеере/плагине
только в цикле отслеживать, но это работа на сам таймер
попробовал рядом запустить флешку, которая как раз только этим и занимается и по LocalConnection докладывает основной, но там десятки мс теряются влегкую, что сводит на нет эту затею..
других вариантов не вижу

Старый 06.06.2008, 15:58
aksios вне форума Посмотреть профиль Отправить личное сообщение для aksios Найти все сообщения от aksios
  № 3  
Ответить с цитированием
aksios
loading 50%
 
Аватар для aksios

Регистрация: Jun 2005
Адрес: I am where I should be
Сообщений: 3,567
Отправить сообщение для aksios с помощью ICQ
Помоему, надо совсем другой подход применять - для создания таймера повышенной точности. Нужно привязываться к тактам, за которые выполняется оператор и вывод данных отдельно подготавливать.
В общем, флеш неоправдан.

Старый 06.06.2008, 17:01
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
silin:
угу, тоже думал, но фик там... =)

aksios:
ну это по определению должен быть флеш... было бы что-то другое, наверное, по другому бы и решал... тут проблема еще и такая, ну, предположим, я знаю, когда функция закончила работать, и до следующего вызова осталось около 10 миллисекунд, и, тут-то, млин незадача, как ее вызвать-то именно через 10 миллисекунд, а не через 5-15... заускать цикл так как в примере - хреновый вариант т.как параллельно с флешкой должно быть запущено еще одно приложение (обязательно), а когда флешка начинает считать цикл она (по крайней мере на моем компе) занимает 1 проц на 100% (у мну их 2 х 2,3)... а это как-то очень жирно для такой нехитрой операции как "ничего не делать" %)
__________________
Hell is the possibility of sanity

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

Теги
setinterval , settimeout , timer
Опции темы
Опции просмотра

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

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


 


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


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