forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=48)
-   -   Алгоритм отображение FPS (http://forum.boolean.name/showthread.php?t=16887)

Atqt 09.06.2012 22:30

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

AVL 10.06.2012 01:16

Ответ: Алгоритм отображение FPS
 
Функция, возвращает количество вызовов себя за секунду, причем это значение обновляется раз в секунду:
Код:

var
  pr_fps, frames, pr_upd:integer;

function fps: integer;
var
  dt:integer;
begin
  dt := GetRelativeTimeMs - pr_upd;//время с предыдущего обновления значения (pr_upd)
  if dt<1000 then
    frames:=frames+1//если прошло менее секунды - считаем кадры
  else begin
    pr_upd:=pr_upd+dt; //если больше - запоминаем текущее время
    pr_fps:=frames;  //возвращаем то что посчитали
    frames:=0; //обнуляем счетчик кадров
  end;
  fps2:=pr_fps;
end;

Для удобства можно это вынести в модуль или либу.

Atqt 10.06.2012 15:48

Ответ: Алгоритм отображение FPS
 
Вопрос fps2:=pr_fps; не так должно быть fps:=pr_fps; ? И если да, то почему-то показывает 0.

AVL 10.06.2012 21:17

Ответ: Алгоритм отображение FPS
 
Вложений: 1
Да, точно.
В общем, так: под катом - полный код модуля с 2мя функциями подсчета фпс: (первая - отсюда (немного доработал))
Код:

unit fps;

interface
var
  t: integer;
  pr_fps, frames, pr_upd:integer;
function fps: integer;
function fps2: integer;

implementation

function fps: integer;
var
  dt: integer;
begin
  dt := GetRelativeTimeMs - t;
  //время с предыдущего вызова функции
  t := t + dt;
  if dt <> 0 then
    fps := 1000 div dt
  else
    fps := 1000;
end;

function fps2: integer;
var
  dt:integer;
begin
  dt := GetRelativeTimeMs - pr_upd;
  if dt<1000 then
    frames:=frames+1
  else begin
    pr_upd:=pr_upd+dt;
    pr_fps:=frames;
    frames:=0;
  end;
  fps2:=pr_fps;
end;


initialization
  t := GetRelativeTimeMs;
  pr_upd:=t;
  pr_fps:=0;
  frames:=0;
end.


В аттаче - скомпиленная из этого кода библиотека.

Atqt 10.06.2012 21:50

Ответ: Алгоритм отображение FPS
 
AVL можешь объяснить такую штуку... Второй способ я находил в открытых проектах и ставил себе в код, вроде все работало нормально, но порой по неизвестным мне причинам он начинал показывать 0 как на телефоне, так и на эмуле. Вот и сейчас второй способ показывает 0... Допустим пишу программу фпс отображает, позже начинается какой-то глюк показывает 0, через время опять показывает нормальное значение и так по кругу. С чем это связано?
зы компилил 2.02 en и 3.5 без разницы

Yadro 10.06.2012 22:24

Ответ: Алгоритм отображение FPS
 
Вот моя версия:
PHP код:

var lastSavedTime,n,kolvofps:integer;

Procedure fps;

begin
  n
:=n+1;
  if ((
lastSavedTime-getRelativeTimeMs) < -1000) or (getRelativeTimeMs lastSavedTimethen
   begin 
     kolvofps
:=n;
     
lastSavedTime:=getRelativeTimeMs;
     
n:=0;
   
end;
  
SetColor(255255255);
  
drawtext(integertostring(kolvofps),2,2);
end


AVL 11.06.2012 00:45

Ответ: Алгоритм отображение FPS
 
Цитата:

Сообщение от Atqt (Сообщение 230016)
Вот и сейчас второй способ показывает 0...

У меня он показывает 0 только на 1й секунде. Уже в нескольких играх эту либу использовал, все всегда нормально работает.

Igor 11.06.2012 12:45

Ответ: Алгоритм отображение FPS
 
Я в модуле делал функцию RepaintFPS:integer;
которая каждый раз возвращала время между кадрами и рисовала фпс (оно другое) на экран

var FP,n,t,TOld:integer;

procedure repaintFPS;
var Rel:integer;
begin
Rel:=GetRelativeTimeMS;
if Rel-t>1000 then
begin
t:=Rel;
Fp:=n;
n:=-1;
end;
n:=n+1;
repaintFPS:=Rel-Told;
Told:=Rel;
setcolor(0,0,0);
drawtext(IntegerToString(FP),0,0);
repaint;
end;

initialization
t:=GetRelativeTimeMS;
TOld:=t;
end.

PassCall 12.06.2012 23:33

Ответ: Алгоритм отображение FPS
 
Ну я делал так. Надеюсь все понятно будет :mda:

К некому циклу (процедуре) привязывается счетчик, который приращивается на столько, сколько занимает "должная" задержка (допустим есть некий цикл с задержкой 25 миллисекунд в конце. Следовательно, каждый такт приращивает счетчик на 25).

Как только счетчик равен или больше 1000 - Сбрасываем счетчик (отнимаем 1000), вычисляем реальное время, прошедшее от того момента, когда счетчик был равен нулю, до того, когда он перевалил за 1000.

далее следует такая формула:
задержка цикла*1000/время реальной задержки.

Пример:
Цикл должен был выполниться 40 раз за секунду (25 миллисекунд задержка цикла). Но это произошло за две реальных секунды (по секундомеру).

25*1000/2000=12.5 ФПС.

И да, процедуру проверки заполненности счетчика лучше вынести в отдельный поток. Так то!

Igor 14.06.2012 01:07

Ответ: Алгоритм отображение FPS
 
Я ничего не понял. Зачем так сложно? Мой пример выводит фпс и даёт время между обновлениями экрана для дельтатайминга. А твой?


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot