![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: May 2010
Адрес: 55.755786° с.ш. 37.617633° в.д.
Сообщений: 12
|
Думаю многим приходилось сталкиваться с тем, что какое-либо вычисление требует большой затраты времени, при этом критично чтобы не падал fps и совершенно не критично, что операция закончится в том же кадре, что и началась.
Я представляю себе реализацию такого механизма примерно так: Регистрируем два слушателя ENTER_FRAME с приоритетами такими, чтобы первое вызывалось заведомо раньше всех остальных, а второе - заведомо позже. В первом просто запоминаем время через getTimer(); Во втором проверяем сколько времени прошло с момента ENTER_FRAME и по-возможности запускаем обработчики, которые ведут вычисления, после их выполнения снова смотрим время и т.д. При этом обработчики должны обладать фиксированным временем исполнения (не использовать рекурсий, пробежек по циклам, с заранее неизвестным размером и т.д.), каждый нужно протестировать на среднее время исполнения и захардкодить это время. Может быть у кого-то есть более "прямые" идеи реализации сего? Также меня смущает такой вопрос: как узнать какая часть 1/framerate сек расходуется на рендеринг и какое время с момента входа в кадр я могу считать за дедлайн для скрипта чтобы не просел фпс. |
|
|||||
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 |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Может проще счетчик fps сделать, и уже исходя из его отношения currentFps к targetFps делать какие-либо выводы?
|
|
|||||
|
Регистрация: May 2010
Адрес: 55.755786° с.ш. 37.617633° в.д.
Сообщений: 12
|
2 incvizitor:
Да, примерно так, но в этом примере во-первых жёстко вбито выполнение не более 20 мс, тогда как эта величина явно должна зависеть от fps, с которым скомпилена swf, иначе при высоком fps он всё же будет проседать, а при низком наоборот будет наблюдаться неэффективное использование ресурсов. Кроме того пример расчитан только на одно долгое вычисление, а их может быть несколько разного типа и начинающихся по разным событиям. 2 i.o.: Ну вообще идея - достичь такого, чтобы currentFps тождественно равнялся targetFps. Я на самом деле надеялся что кто-то предложит какой-нибудь стандартный класс (т.е. де-факто стандартный, а не входящий в стандартный набор), которым все профи активно пользуются и который я не смог найти через поиск, так как не подобрал подходящих ключевых слов. |
|
|||||
|
Вот здесь как раз тот редкий случай когда удобно использовать конвеер Потапенко (ну или самому упрощенную версию слепить),
но придется задать число шагов фиксированным до начала вычислений 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 } Существует еще такой способ (о надежности сложно говорить, но, по идее порядок операций поломаться не должен): Последний раз редактировалось expl; 13.09.2010 в 22:04. |
|
|||||
|
Регистрация: May 2010
Адрес: 55.755786° с.ш. 37.617633° в.д.
Сообщений: 12
|
2 expl:
Отлично, ещё бы где-нибудь этот конвейер найти, так как все ссылки в поиске по этому форуму, да и просто в поисковике ведут на potapenko.com, где сейчас нет ничего, кроме предложения стать обладателем этого домена. Последний раз редактировалось totto; 14.09.2010 в 00:14. |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
totto
а чем не подходит задавать кол-во времени на выполнение исходя из текущего фпс? |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Чего тут объяснять?
Есть счетчик фпс, высчитывающий currentFps. Есть исходное фпс к которому мы стремимся - targetFps. Каждый раз, перед тем как запустить числодробильные операции - мы считаем отношение fpsRatio = currentFps / targetFps. Если fpsRatio меньше единицы, то у нас идет перегрузка процессора. Вот от этой величины и пляшем - умножаем ее на расчетное время, при котором у нас фпс не провисает, и получаем время для исполнения числодробильных операций, при котором они не просадят фпс. |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:45. |
|
|
« Предыдущая тема | Следующая тема » |
|
|