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

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

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

Регистрация: May 2010
Адрес: 55.755786° с.ш. 37.617633° в.д.
Сообщений: 12
По умолчанию Разбиение ресурсоёмких операций по кадрам

Думаю многим приходилось сталкиваться с тем, что какое-либо вычисление требует большой затраты времени, при этом критично чтобы не падал fps и совершенно не критично, что операция закончится в том же кадре, что и началась.

Я представляю себе реализацию такого механизма примерно так:
Регистрируем два слушателя ENTER_FRAME с приоритетами такими, чтобы первое вызывалось заведомо раньше всех остальных, а второе - заведомо позже.
В первом просто запоминаем время через getTimer();
Во втором проверяем сколько времени прошло с момента ENTER_FRAME и по-возможности запускаем обработчики, которые ведут вычисления, после их выполнения снова смотрим время и т.д.
При этом обработчики должны обладать фиксированным временем исполнения (не использовать рекурсий, пробежек по циклам, с заранее неизвестным размером и т.д.), каждый нужно протестировать на среднее время исполнения и захардкодить это время.

Может быть у кого-то есть более "прямые" идеи реализации сего?
Также меня смущает такой вопрос: как узнать какая часть 1/framerate сек расходуется на рендеринг и какое время с момента входа в кадр я могу считать за дедлайн для скрипта чтобы не просел фпс.

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

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
Код AS3:
var _i:uint=0;
var _j:uint=0;
 
var over:Shape=new Shape();
addChild(over);
 
trace(getTimer());
longCicle();
 
function longCicle():void{
 
	var t:uint=getTimer();
	for(var i:uint=_i; i<100000; i++){
		for(var j:uint=_j; j<20000; j++){
		}
		_j=0;
		if(getTimer()-t> 20){
 
			_i=i;
			_j=j;
			var p:Number = i * j / 100000 / 20000;
 
			drawProgress(p);
			setTimeout(longCicle,1);
			return;
		}
 
	}
	drawProgress(1);
	trace(getTimer() - 1000);
}
 
function drawProgress(p:Number):void{
 
	over.graphics.clear();
	over.graphics.beginFill(0,0.4);
	over.graphics.drawRect(0,0,stage.stageWidth * p, stage.stageHeight);
}
Что то типа этого?
__________________
ranga

Старый 13.09.2010, 19:33
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 3  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Может проще счетчик fps сделать, и уже исходя из его отношения currentFps к targetFps делать какие-либо выводы?

Старый 13.09.2010, 21:37
totto вне форума Посмотреть профиль Отправить личное сообщение для totto Найти все сообщения от totto
  № 4  
Ответить с цитированием
totto

Регистрация: May 2010
Адрес: 55.755786° с.ш. 37.617633° в.д.
Сообщений: 12
2 incvizitor:
Да, примерно так, но в этом примере во-первых жёстко вбито выполнение не более 20 мс, тогда как эта величина явно должна зависеть от fps, с которым скомпилена swf, иначе при высоком fps он всё же будет проседать, а при низком наоборот будет наблюдаться неэффективное использование ресурсов.
Кроме того пример расчитан только на одно долгое вычисление, а их может быть несколько разного типа и начинающихся по разным событиям.
2 i.o.:
Ну вообще идея - достичь такого, чтобы currentFps тождественно равнялся targetFps.

Я на самом деле надеялся что кто-то предложит какой-нибудь стандартный класс (т.е. де-факто стандартный, а не входящий в стандартный набор), которым все профи активно пользуются и который я не смог найти через поиск, так как не подобрал подходящих ключевых слов.

Старый 13.09.2010, 21:48
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Вот здесь как раз тот редкий случай когда удобно использовать конвеер Потапенко (ну или самому упрощенную версию слепить),
но придется задать число шагов фиксированным до начала вычислений

Код AS3:
for (var i:int = 0; i < NUM_STEPS; i++)
{
    conveyor.add(doStep, i);
    conveyor.addFrames(1);// Добавляем ожидание следующего кадра
}
 
// Добавляем вычисления другого рода
for (var i:int = 0; i < NUM_ANOTHER_STEPS; i++)
{
    conveyor.add(...);
    conveyor.addFrames(1);// Добавляем ожидание следующего кадра
}
 
conveyor.add(onComplete);// Добавляем колбек завершения всех вычислений
conveyor.play();
 
private function doStep(step:int):void
{
     // считаем шаг step
}
Иначе решение incvizitor'а самое эффективное, хоть и не особо читаемое

Существует еще такой способ (о надежности сложно говорить, но, по идее порядок операций поломаться не должен):
Код AS3:
const DELAY:int = 10;
for (var i:int = 0; i < NUM_STEPS; i++)
{
    setTimeout(doStep, i * DELAY, i);
}
setTimeout(onComplete, NUM_STEPS * DELAY);


Последний раз редактировалось expl; 13.09.2010 в 22:04.
Старый 14.09.2010, 00:08
totto вне форума Посмотреть профиль Отправить личное сообщение для totto Найти все сообщения от totto
  № 6  
Ответить с цитированием
totto

Регистрация: May 2010
Адрес: 55.755786° с.ш. 37.617633° в.д.
Сообщений: 12
2 expl:
Отлично, ещё бы где-нибудь этот конвейер найти, так как все ссылки в поиске по этому форуму, да и просто в поисковике ведут на potapenko.com, где сейчас нет ничего, кроме предложения стать обладателем этого домена.


Последний раз редактировалось totto; 14.09.2010 в 00:14.
Старый 14.09.2010, 10:12
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 7  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
totto
а чем не подходит задавать кол-во времени на выполнение исходя из текущего фпс?

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

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
@ i.o.:
Наверное тем что Вы не объяснили нам как это сделать.
__________________
ranga

Старый 14.09.2010, 15:38
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 9  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Чего тут объяснять?
Есть счетчик фпс, высчитывающий currentFps.
Есть исходное фпс к которому мы стремимся - targetFps.
Каждый раз, перед тем как запустить числодробильные операции - мы считаем отношение fpsRatio = currentFps / targetFps.
Если fpsRatio меньше единицы, то у нас идет перегрузка процессора. Вот от этой величины и пляшем - умножаем ее на расчетное время, при котором у нас фпс не провисает, и получаем время для исполнения числодробильных операций, при котором они не просадят фпс.

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

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
Ок. Я просто подумал что Вы предлагали в самом цикле проверять ФПС, поэтому немного удивился
__________________
ranga

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

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

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


 


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


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