Page 1 of 1
Problem - Calculate fps and regulating this.
Posted: 24 Nov 2014 21:45
by Honguito98
Hi at all.
I trying to code a '
fps calculator', but I have some problems.
FPS counter does not show correctly, and when I change the frames per second limit (MaxFPS var), the FPS counter exceeds the limit.
Any feedback is appreciated.
Code: Select all
@Echo Off
SetLocal EnableDelayedExpansion
:Tick
Rem Get the 'scale', how many 'calls' is required for get a milliseconds?
Set "T=!Time!"
For /L %%T in (1,1,1000) Do (
Call
If "!Time:~-2!" Equ "01" Set Scale=%%T
)
Set __T[1]=-1
Set __T[2]=-1
Set __Cnt=0
Set FPS=0
Set MaxFPS=20
:Main
For /L %%! in (1,1,20055) Do (
Cls & Echo; FPS: !FPS! Percent: !AVG!%% - No implemented-
for /l %%a in (1,1,1220) do call
%== FPS compute ==%
Set /a __Cnt+=1
For /F "Tokens=* Delims=0" %%A in ("!Time:~-2!") Do Set "__T[!__Cnt!]=%%A!Random:~0,1!" & Set T[!__Cnt!]=!Time!
If !__Cnt! Geq 2 (
Rem Milliseconds roll over
If !__T[1]! Gtr !__T[2]! (
Set /a "TimeCoef=1000 - (__T[1] - __T[2])"
) Else Set /a "TimeCoef=__T[2] - __T[1]"
If !__T[1]! Neq !__T[2]! (
Set /a "FPS=1000 / TimeCoef"
)
Set "__Cnt=0"
If !FPS! LSS !MaxFPS! Cls & Echo; FPS: !FPS!
)
If !FPS! Gtr !MaxFPS! (
Rem MaxCOEF - FPSCOEF
Rem Calculate milliseconds from FPS limit (60) and calculate milliseconds from current frame
Rem then subtract this values
Set /a "__ScaleLimit=((1000 / MaxFPS) - (1000 / FPS))"
Rem slowdown the code for x milliseconds
For /L %%` in (0,1,!__ScaleLimit!) Do For /L %%' in (0,1,!Scale!) Do Call
)
rem echo;!T[1]!____!__T[1]! !T[2]!_____!__T[2]! -- !__Cnt! ------ !__ScaleLimit!
rem pause
)
Goto :Main
Re: Problem - Calculate fps and regulating this.
Posted: 25 Nov 2014 14:33
by aGerman
The Frames Per Second of
what are you trying to calculate?
To be honest neither do I understand on what your calculation is based nor do I understand your code at all.
Code: Select all
Rem Get the 'scale', how many 'calls' is required for get a milliseconds?
Set "T=!Time!"
For /L %%T in (1,1,1000) Do (
Call
If "!Time:~-2!" Equ "01" Set Scale=%%T
)
The last 2 digits of the %time% variable show up as centiseconds not as milliseconds.
And you do not know the initial value of %time%. It could happen the last 2 digits are already 01 in the first iteration of your loop as well as they could be 01 several times during 1000 iterations where 'Scale' would be changed several times. Thus, the value of %Scale% is more or less random and probably completely different each time you run the code.
Further more: what has the time that the CALL command takes to do with your calculation of FPS?
Regards
aGerman
Re: Problem - Calculate fps and regulating this.
Posted: 02 Dec 2014 15:29
by einstein1969
Hi Honguito98,
the TIME variable is instable.
I have studied for time this variable form gaming porpouse...
1) the variable on windows 7 depend on "timer coaleshing" and i thinks the same on windows 8.x
2) the variable skip some value.
3) the variable depend on internal timer that have a resolution variable.
But i think there are solution for these problems.
first you need analyze the timer resolution of OS:
Code: Select all
C:\Windows\system32>powercfg -energy -xml duration 1
Attivazione della traccia per 1 secondi in corso...
Analisi del comportamento del sistema in corso...
Analisi dei dati di traccia in corso...
Analisi completata.
will produce "energy-report.xml"
search 843c944e-9fc2-4e58-9e58-9bfdf0ea25b2 and e5ba7e97-57dd-4378-a022-0b5b3fff3d22
Code: Select all
<Name>Risoluzione timer di piattaforma</Name>
<AnalysisLog>
<LogEntry guid="843c944e-9fc2-4e58-9e58-9bfdf0ea25b2">
<Name>Risoluzione timer di piattaforma</Name>
<Severity>Informational</Severity>
<Description>La risoluzione predefinita del timer di piattaforma è 15,6 ms (15625000 ns) e deve essere utilizzata ogni volta che il sistema è inattivo. Se la risoluzione del timer aumenta, le tecnologie di risparmio energia del processore potrebbero non essere efficaci. La risoluzione del timer può aumentare in caso di riproduzione multimediale o di animazioni grafiche.</Description>
<Details>
<Detail guid="e5ba7e97-57dd-4378-a022-0b5b3fff3d22">
<Name>Risoluzione timer corrente (unità di 100 ns)</Name>
<Value>156000</Value>
</Detail>
</Details>
</LogEntry>
on my machine the current timer is 15600000 ns (or 15625000 ns)
the variable %TIME% get the value from this timer!this explain why there are GAP on the variable TIME.
ref :
http://www.dostips.com/forum/viewtopic.php?p=31740#p31740ref :
http://www.dostips.com/forum/viewtopic.php?p=30206#p30206 The TIME variable don't increment by 1 cs but 1.56 cs and then produce 100/1.56=64 values (the max frequency)
einstein1969
Re: Problem - Calculate fps and regulating this.
Posted: 07 Dec 2014 08:21
by einstein1969
This is a sample for the same functionality.
Code: Select all
@echo off
cls
SetLocal EnableDelayedExpansion
Rem Empty environment for best set-set/A performance.
For /F "delims==" %%v in ('set') do if /I Not "%%v"=="TMP" if /I Not "%%v"=="Temp" set "%%v="
call :pre_game1
set N=0
set k=0
set /A maxFPS=4
set /A cs=100/maxFPS
set t=!time: =0!
:loop
(
rem do some stuff/game
rem call :game2
call :game1
)
:delay
(
set tc=!time: =0!
for /F "tokens=1-8 delims=:.," %%a in ("!t!:!tc!") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000"
if !a! lss !cs! goto :delay
if !a! gtr !cs! set /a a-=1
set t=!tc!
if !a! neq 0 (set /A fps=100/a) else set fps=?
title FPS:!fps!/s
)
goto :loop
:game2
set /A N+=1
if !N! equ 1 set/P "=!time!" <nul
set/P "=." <nul
if !N! equ !maxFPS! (set N=0 & echo()
goto :eof
:game1
cls&for /F %%k in ("!K!") do for /L %%N in (1,1,4) do echo(!L[%%k,%%N]!
set /a k=k+1 & if !k! gtr 5 set k=0
goto :eof
:pre_game1
set L[0,1]=
set L[0,2]= _o
set L[0,3]= _^< \_
set L[0,4]= (_)^>(_)
set L[1,1]=
set L[1,2]= _o
set L[1,3]= _^< \_
set L[1,4]= (_)^>(_)
set L[2,1]= o
set L[2,2]= /\_
set L[2,3]= _^>(_)
set L[2,4]= (_)
set L[3,1]= _
set L[3,2]= _ \\o
set L[3,3]= (_)/^<_
set L[3,4]= (_)
set L[4,1]= _
set L[4,2]= (_)\__/o
set L[4,3]= \_^| \
set L[4,4]= (_)
set L[5,1]= _
set L[5,2]= (_)
set L[5,3]= _^|/' \/
set L[5,4]= (_)' _\o_
goto :eof
Edit: Correct some flaw
einstein1969
Re: Problem - Calculate fps and regulating this.
Posted: 07 Dec 2014 09:26
by foxidrive
einstein1969 wrote:Code: Select all
Rem Empty environment for best set-set/A performance.
For /F "delims==" %%v in ('set') do if Not "%%v"=="TMP" set "%%v="
Your routine above has some flaws Einstein.
A) The
temp variable is used most often.
B) Your comparison is case sensitive.
Re: Problem - Calculate fps and regulating this.
Posted: 08 Dec 2014 07:56
by Squashman
Einstein,
Is this batch suppose to work? Didn't do anything but spew code onto my screen.
Re: Problem - Calculate fps and regulating this.
Posted: 08 Dec 2014 12:08
by penpen
Just add the first line:
penpen
Re: Problem - Calculate fps and regulating this.
Posted: 09 Dec 2014 02:47
by lmstearn
This looks ambitious. Hope it will continue to be developed, for once the FPS is calculated within a tolerance then calibrating it is trivial. Problem will then be hooking into popular games so the info is captured in game screen.
Re: Problem - Calculate fps and regulating this.
Posted: 09 Dec 2014 15:13
by Squashman
Would be cooler to simulate the wheels turning.
Re: Problem - Calculate fps and regulating this.
Posted: 12 Dec 2014 10:25
by einstein1969
thanks foxidrive, thanks penpen : i have added your suggestion
@squashman : you are right
I have probed to get the millisecond but it is difficult to
syncronize. It is easy calculate a average value.
einstein1969