![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Счётчик fps. [Delphi, Windows]
Zak3D[@Tm] © (2004-01-14 11:09:00)Ермак, когда-то ты мне таким способом посоветовал делать счётчик fps, возник вопрос
-куда этот обработчик вставлять?
///////////////
uses Windows;
а дальше GetTickCount - возвращает число милисекунд, прошедших с начала запуска системы.
То есть:
Var time: cardinal;
fps: real;
...///что за прочедура???
begin
...
time := GetTickCount;
...Здесь мы рисуем очередной кадр...
time := GetTickCount - time; //А здесь посчитали, сколько милисекунд ушло на кадр.
fps := 1000 / time; //Поскольку в секунде тысяча милисекунд...
...Выводим куда-нить ФПС...
////////////////////////////
это наверно тупой вопрос, но помогите если не лень.
NailMan (2004-01-15 12:24:00) [1]А я не парюсь и считаю фактическое число ФПС:
var Frames, minfps, maxfps:Integer;
avrgfps:Single
Создается обработчик таймера, который будет нам обрабатывать счетчик фпс.
Procedure TimerFPSHandler;
begin
FPSString:=inttostr(frames); //Создаем строчку для рисования на экране
if frames<minfps then minfps:=frames; //определяем минимальный фпс
if frames> maxfps then maxfps:=frames; //определяем максимальный фпс
avrgfps:=(avrgfps + frames); //считаем сумму для среднего
inc(secs); //прибавляем секунды прошедшие с начала отсета времени
frames:=0; //зануляем счетчик
end;
Далее при создании сцены или приложения(но тогда надо обнулить перед созданием сцены avrgfps,frames,maxfps,minfps(=maxint)) мы создаем виндовый таймер(при выходе убиваем).
Procedure SetTimers(onn:boolean);
begin
if onn then
begin
SetTimer(Handle,1,1000,@TimerFPSHandler);
end else
begin
KillTimer(Handle,1);
end;
end;
В методе сцены Render, в самом конце мы делаем Inc(Frames);
На выходе из приложния делаем avrgfps:=avrgfps / Secs; и получаем средний фпс за все время работы приложения.
Таким образом считаются фактическое число кадров которое было на прошедшей секунде. Надежно и просто.
вставыил в onPaint выдает на ноль делить нельзя, что делать, как правильно перевести из real в string?
Блин конечно будет выдавать ноль. Ты перед тем как делать такой счетчик почитал бы в RTFM про GetTickCount. Этот счетчик имеет минимальное разрешение времени равное ~20 мс. Тоесть меньшее время ты ни как им не отловишь.
B4rr4cuda (2004-01-15 01:25:00) [2]Первую часть (time := GetTickCount;)
пишешь перед обработкой очередного кадра, а потом
проводим вычисления количества милисикунд ушедших на обработк
(time := GetTickCount - time;).
Для информации: GetTickCount - возвращает кол-во миллисекунд
прошедших с момента запуска компьютера.
Zak3D[@Tm] (2004-01-14 19:59:00) [3]Блин, ну никак не получается, ко-небудь может всё дословно написать, даже не знаю, что не так делаю, как только не пробовал. :(
Darthman (2004-01-14 16:41:00) [4]floattostr();
Если нельзя делить на ноль, не дели.
Zak3D[@Tm] (2004-01-14 15:50:00) [5]вставыил в onPaint выдает на ноль делить нельзя, что делать, как правильно перевести из real в string?
Darthman (2004-01-14 15:28:00) [6]обработчик события idle. Есть еще onPaint, в него можно поместить... да много куда, собственно.
Zak3D[@Tm] (2004-01-14 14:47:00) [7]Разъясни, пожалуйста, что такое onidle.
Darthman (2004-01-14 13:23:00) [8]наверное, перед и после вывода кадра.... а все это вместе либо в обработчике таймера, либо в onidle