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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.07.2011, 15:30
Anton Riot вне форума Посмотреть профиль Отправить личное сообщение для Anton Riot Посетить домашнюю страницу Anton Riot Найти все сообщения от Anton Riot
  № 1  
Ответить с цитированием
Anton Riot

Регистрация: Sep 2008
Адрес: Москва
Сообщений: 291
Отправить сообщение для Anton Riot с помощью ICQ
По умолчанию ENTER_FRAME (25fps) и setInterval(40)

Есть ролик, fps=25.
Если выполнять функцию по слушателю на Event.ENTER_FRAME, то результат выглядит хорошо
Если выполнять ту же функцию через setInterval(..., 40) или Timer(40), то результат выглядит плохо
(двигайте кружок стрелками управления)
Разница проявляется только при просмотре через браузер. Почему так?

Старый 13.07.2011, 16:19
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Потому, что у вас чехарда в коде.
В fFrame.swf, внутри onFrameEnter сначала выполняется некий код, а потом дергается game. И все работает синхронно.
А в fTimer.swf, некий код продолжает работать внутри onFrameEnter, но game дергается из timerEvent. Только вот события работаю не синхронно. То, что вы поставили Timer(40), не говорит о том, что он будет срабатывать синхронно с onFrameEnter. Таймер может сработать и через 50 мс.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 13.07.2011, 16:25
Anton Riot вне форума Посмотреть профиль Отправить личное сообщение для Anton Riot Посетить домашнюю страницу Anton Riot Найти все сообщения от Anton Riot
  № 3  
Ответить с цитированием
Anton Riot

Регистрация: Sep 2008
Адрес: Москва
Сообщений: 291
Отправить сообщение для Anton Riot с помощью ICQ
нет, это не причина. Я могу вообще убрать onFrameEnter в fTimer.swf и отображать (присваивать координаты) внутри game, это будет делаться каждые 40мс согласно setInterval

То, что там так написано - это следствие моих экспериментов с onFrameEnter vs setInterval. Я пытался понять, при каких условиях будет дёргание, а при каких не будет.

Добавлено через 7 минут
Вот, так как было изначально: только setInterval смотреть
Соответственно класс, который вы любезно посмотрели, я выложил для удобства рядом же

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

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Возможно потому что render всегда идёт строго после enter frame. А при таймере - не всегда. Т.е. между двумя вызовами рендера может быть как 0 вызовов таймера, так и два (а надо бы один). Это можно проверить экспериментально =)
update after event был какой-то, по идее поможет. А лучше тупо по фрейму)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.


Последний раз редактировалось -De-; 13.07.2011 в 16:38.
Старый 13.07.2011, 16:36
Anton Riot вне форума Посмотреть профиль Отправить личное сообщение для Anton Riot Посетить домашнюю страницу Anton Riot Найти все сообщения от Anton Riot
  № 5  
Ответить с цитированием
Anton Riot

Регистрация: Sep 2008
Адрес: Москва
Сообщений: 291
Отправить сообщение для Anton Riot с помощью ICQ
интересно не только, что setInterval(...,40) и ENTER_FRAME при фпс 25 ведут себя по-разному (по идее и там и там функция должна выполняться 25 раз в секунду + и там и там фпс ролика один и тот же), но и то, что различие проявляется только в браузере. Нагрузки тут никакой нет, т.к. вычисления минимальны (меньше 1 мс), фпс не большой (я помню, что браузеры не дают больше 60 фпс)

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

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Тут дело в равномерности. Там не ровно 40мс, а пляшет этак по +=10. Причем и при рендере/фрейме и при таймере. Если оно пляшет по-разному - получайте неравномерность движения.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 13.07.2011, 16:41
Anton Riot вне форума Посмотреть профиль Отправить личное сообщение для Anton Riot Посетить домашнюю страницу Anton Riot Найти все сообщения от Anton Riot
  № 7  
Ответить с цитированием
Anton Riot

Регистрация: Sep 2008
Адрес: Москва
Сообщений: 291
Отправить сообщение для Anton Riot с помощью ICQ
-De-, разумно, но ставим эксперимент: меняем координаты шариков только по ENTER_FRAME, а вычисления проводим в setInterval. Причём фпс ставим 50, а считаем 25 раз в секунду. (iNils, это то, что вы назвали чехардой). При таком раскладе, рендер должен всегда отображать каждое перемещение (т.к. проходит в 2 раза чаще, чем вычисление новых координат). Но увы, результат плохой - выглядит в браузере нехорошо.

Старый 13.07.2011, 16:41
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Я предлагаю вам убрать все лишнее, оставить только движение и варианты вызова, и выложить сюда.
Декомпилировать ваш код и искать в нем различия не удобно.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Не каждое, а последнее которое произошло в этом кадре. С предыдущим вариантом разницы нет.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 13.07.2011, 16:53
Anton Riot вне форума Посмотреть профиль Отправить личное сообщение для Anton Riot Посетить домашнюю страницу Anton Riot Найти все сообщения от Anton Riot
  № 10  
Ответить с цитированием
Anton Riot

Регистрация: Sep 2008
Адрес: Москва
Сообщений: 291
Отправить сообщение для Anton Riot с помощью ICQ
когда считаем раз в 40мс, а отображаем раз в 20 мс, отобразится результат каждого пересчёта - разве нет?
iNils, можно не этот код, а для теста:

Код AS3:
var circle:Sprite = new Sprite();
circle.graphics.beginFill(0x00FF00);
circle.graphics.drawCircle(0,0,10);
circle.graphics.endFill();
circle.x = 60;
circle.y = 20;
 
addChild(circle)
 
var speed:Number = 3;
//setInterval(calculate, 40);
addEventListener(Event.ENTER_FRAME, onFrameEnter);
function onFrameEnter(event:Event):void {
	calculate();
}
 
function calculate():void {
	if((circle.x > 250)||(circle.x < 50)) {
		speed *=-1;
	}
	circle.x += speed;
}
Добавлено через 1 минуту
и, собственно, к зависимости от браузера: получается, погрешность fps, setInterval и Timer становится сильной при отображении через браузер?

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

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

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


 


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


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