PDA

Просмотр полной версии : как сделать FPS-тест?


Crash512
21.08.2008, 18:13
Нужно выводить строку с текущим FPS, чтобы проверить на тормоза прилоежние в разных условиях. Как это сделать? (на AS2.0 или AS3.0)

lexa2000lexa
21.08.2008, 18:37
можно заюзать вот это кусок кодаvar fps:Number = 0;
var frames:Number = 0;
var time:Number = getTimer();
this.onEnterFrame = function():Void {
frames++;
if (frames == 10) {
fps = frames/(getTimer() - time);
field.text = Math.round(fps*100000)/100;
time = getTimer();
frames = 0;
}
}

chingachgoog
21.08.2008, 18:49
onEnterFrame=function(){
f1=getTimer()
trace(1000/(f2-f1))
f2=f1
}

qazwsx
22.08.2008, 08:55
И получаем отрицательное число с разбросом от -5 до -32 при выставленном фпс 32. Но это не главное главное что при фпс выставленном больше 32 мы получим тоже самое...

var fp:Number = 0;
var time:Number = 1;

function enterFrame():Void{
fp++;
var tTime:Number = getTimer()/1000;

if(tTime>time){
time++;
trace(fp);
fp = 0;
}
}
Вот это и в прям фпс потому что отображает количество кадров в секунду. Похоже на спидометр чемто :)

etc
22.08.2008, 10:44
И получаем отрицательное число с разбросом от -5 до -32 при выставленном фпс 32. Но это не главное главное что при фпс выставленном больше 32 мы получим тоже самое...

var fp:Number = 0;
var time:Number = 1;

function enterFrame():Void{
fp++;
var tTime:Number = getTimer()/1000;

if(tTime>time){
time++;
trace(fp);
fp = 0;
}
}
Вот это и в прям фпс потому что отображает количество кадров в секунду. Похоже на спидометр чемто :)
Мне вот интересно, с какой целью вы getTimer() делите на 1000 каждый кадр?

qazwsx
22.08.2008, 11:35
Обрати внимание что time в секундах конечно можно было написать time = 1000 и time+=1000 и не делить

etc
22.08.2008, 13:00
onEnterFrame = function() {
t = getTimer();
trace(1000/(t - ot));
ot = t;
}

chingachgoog
22.08.2008, 13:38
И получаем отрицательное число с разбросом от -5 до -32 при выставленном фпс 32.

Если раздражает черточка впереди числа, то сделайте, как __etc - поменяйте в моем коде (f2-f1) на (f1-f2) :)


Но это не главное главное что при фпс выставленном больше 32 мы получим тоже самое...

А что вы ожидали? Что при выставленном fps в 1000 кадров в секунду в реальности эта тысяча и будет? :) Угадайте, что хотел своим постом спросить Crash512?

qazwsx
22.08.2008, 14:30
А что по вашему фпс бывает только от 1 до 32? Или параметр framesRate сделан просто так и не на что не влияет? Не говоря уже о том что это вобщемто не реальное количество кадров в секунду.

etc
22.08.2008, 14:36
А что по вашему фпс бывает только от 1 до 32? Или параметр framesRate сделан просто так и не на что не влияет? Не говоря уже о том что это вобщемто не реальное количество кадров в секунду.
Да, указанное значение в проекте ± столько же (да-да, даже в большую сторону может быть, особенно это хорошо заметно на сокетных соединениях при приеме данных), совершенно верно. В зависимости от нагрузки. Это реальное значение fps, а не выставленное в свойствах флешки.

qazwsx
22.08.2008, 14:57
Попробуй мой метод использовать и он будет показывать значение: Количество сменившихся кадров за секунду. А в вашем случае это не верная величина ваш расчет с огромной погрешнастью. ФПС это не секунда деленная на време отработки кадра т.к это време не константа это именно количество кадров сменившихся за секунду.

P.S Вы пробовали фпс указать в проекте 120? :/

chingachgoog
22.08.2008, 15:59
Строго говоря тут просто два метода:
1) ваш: вы определяете fps за одну секунду (реальное число кадров за одну секунду)
2) мой метод: я определяю fps для каждого кадра

Т.е. если продолжить вашу аналогию со спидометром, то спидометр у меня, а у вас - одометр с часами.

sergebozz
03.11.2010, 08:27
Предлагаю Вашему вниманию очередную реализации счётчика FPS:

import flash.text.TextField;
var l:uint = getTimer();//-момент; значение таймера при последнем пересчёте, мсек
addEventListener(Event.ENTER_FRAME, e);
var t:TextField = new TextField();//-которое будет отображать значение fps
//!оставляю на случай необходимости наведения красоты
//t.x=0;
//t.y=0;
//t.textColor = 0xffffff;
//t.text = "? fps";
//t.selectable = false;
//t.background = false;
//t.backgroundColor = 0x000000;
stage.addChild(t);
var f:uint = NaN;//-счётчик кадров
function e(e:Event):void
{
var d:uint = getTimer() - l;//-промежуток; кол-во мсек с момента последнего пересчёта
f++;//-увеличиваю счётчик
if (d > 999)
{//?999 - потому, что полагаю более 1-ой секунды считать fps не имеет смысла
//-кол-во кадров | кол-во мсек с момента последнего пересчёта
//- \ /
t.text = String(f) + ':' + String(d);//-отображаю значение fps
stage.setChildIndex(t, stage.numChildren-1);
//?поправляю; перемещаю в самый верхний слой;
f = 0;//-обнуляю счётчик количества кадров
l = getTimer();//-запоминаю момент последнего пересчёта
}
}

alexcon314
03.11.2010, 09:03
sergebozz, офигенно. Только тут раздел про AS2.0 и последнему посту в теме уже больше двух лет.
var f:uint = NaN;//-счётчик кадров
Причем тут NaN?