Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > FAQ

FAQ Часто задаваемые вопросы

Ответ
 
Опции темы
Старый 09.06.2012, 18:30   #1
Atqt
AnyKey`щик
 
Регистрация: 06.08.2011
Сообщений: 14
Написано одно полезное сообщение
(для 4 участников)
Алгоритм отображение FPS

Доброго времени суток. Зарание извеняюсь за глупый вопрос, но ничего хорошего не нашел... Помогите написать алгоритм отображения FPS без постоянных мерцаний, с пояснением кода.
(Offline)
 
Ответить с цитированием
Старый 09.06.2012, 21:16   #2
AVL
Разработчик
 
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 417
Написано 100 полезных сообщений
(для 182 пользователей)
Ответ: Алгоритм отображение 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;
Для удобства можно это вынести в модуль или либу.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Atqt (10.06.2012)
Старый 10.06.2012, 11:48   #3
Atqt
AnyKey`щик
 
Регистрация: 06.08.2011
Сообщений: 14
Написано одно полезное сообщение
(для 4 участников)
Ответ: Алгоритм отображение FPS

Вопрос fps2:=pr_fps; не так должно быть fps:=pr_fps; ? И если да, то почему-то показывает 0.
(Offline)
 
Ответить с цитированием
Старый 10.06.2012, 17:17   #4
AVL
Разработчик
 
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 417
Написано 100 полезных сообщений
(для 182 пользователей)
Ответ: Алгоритм отображение FPS

Да, точно.
В общем, так: под катом - полный код модуля с 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.

В аттаче - скомпиленная из этого кода библиотека.
Вложения
Тип файла: rar Lib_fps.rar (657 байт, 149 просмотров)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Atqt (10.06.2012)
Старый 10.06.2012, 17:50   #5
Atqt
AnyKey`щик
 
Регистрация: 06.08.2011
Сообщений: 14
Написано одно полезное сообщение
(для 4 участников)
Ответ: Алгоритм отображение FPS

AVL можешь объяснить такую штуку... Второй способ я находил в открытых проектах и ставил себе в код, вроде все работало нормально, но порой по неизвестным мне причинам он начинал показывать 0 как на телефоне, так и на эмуле. Вот и сейчас второй способ показывает 0... Допустим пишу программу фпс отображает, позже начинается какой-то глюк показывает 0, через время опять показывает нормальное значение и так по кругу. С чем это связано?
зы компилил 2.02 en и 3.5 без разницы
(Offline)
 
Ответить с цитированием
Старый 10.06.2012, 18:24   #6
Yadro
Нуждающийся
 
Регистрация: 24.04.2012
Сообщений: 57
Написано 7 полезных сообщений
(для 10 пользователей)
Радость Ответ: Алгоритм отображение FPS

Вот моя версия:
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
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Atqt (10.06.2012)
Старый 10.06.2012, 20:45   #7
AVL
Разработчик
 
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 417
Написано 100 полезных сообщений
(для 182 пользователей)
Ответ: Алгоритм отображение FPS

Сообщение от Atqt Посмотреть сообщение
Вот и сейчас второй способ показывает 0...
У меня он показывает 0 только на 1й секунде. Уже в нескольких играх эту либу использовал, все всегда нормально работает.
(Offline)
 
Ответить с цитированием
Старый 11.06.2012, 08:45   #8
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,217
Написано 436 полезных сообщений
(для 784 пользователей)
Ответ: Алгоритм отображение 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.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Atqt (26.07.2012)
Старый 12.06.2012, 19:33   #9
PassCall
Разработчик
 
Аватар для PassCall
 
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений
(для 319 пользователей)
Ответ: Алгоритм отображение FPS

Ну я делал так. Надеюсь все понятно будет

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

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

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

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

25*1000/2000=12.5 ФПС.

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

Всё гениальное - просто.

http://passcall.ucoz.com
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Atqt (26.07.2012)
Старый 13.06.2012, 21:07   #10
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,217
Написано 436 полезных сообщений
(для 784 пользователей)
Ответ: Алгоритм отображение FPS

Я ничего не понял. Зачем так сложно? Мой пример выводит фпс и даёт время между обновлениями экрана для дельтатайминга. А твой?
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


Часовой пояс GMT +1, время: 08:11.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com