Use StopWatch para medir FPS con un problema extraño

Tengo un fragmento de código como este:

 while(true)
 { 
   myStopWatch.Start();
   DoMyJob();
   myStopWatch.Stop();
   FPS = 1000/myStopWatch.Elapsed.ToMillionSeconds();
   myStopWatch.Reset();
 }

which works pretty good, I got the FPS around 100(+/-2). But sometimes I just want to focus on a certain part of the DoMyJob() performance and add some feedbacks, so I split the DoMyJob() a DoMyJob1() y añade DoMyJobs2(). the first part is mainly calculation stuff, second part is to visualize the calculation on the Form and update some indicators.

So the code becomes:

 while(true)
 { 
   myStopWatch.Start();
   DoMyJob_1();
   myStopWatch.Stop();
   FPS = 1000/myStopWatch.Elapsed.ToMillionSeconds();
   myStopWatch.Reset();
   DoMyJob_2();
 }

I did not expect anything would mess up the FPS since DoMyJob1 is almost the same as the original DoMyJob. But oops..it messed up. the FPS becomes frenzy, bouncing between 40 and up to 600 in a somehow random manner. I wiped out the DoMyJob2() and FPS went back to steady 100.

As I examined deep into the FPS sequence, I found out the FPSs are not random at all - they had like 4 or 5 different ranges, in my code, 30-50, 100-120, 300-360, 560-600, etc. Not a single number falls into the gaps. Then I tried the code in another laptop and the issue still exists, but just with different ranges. I know StopWatch uses Win32API. Is it because it's buggy and I run the code on the 64bit system??

BTW: what the best way to measure FPS on .NET Windows Form App? (like if FPS=100 or more)

preguntado el 01 de febrero de 12 a las 22:02

The FPS readings may be linear and consistent because whatever you are doing to prueba the FPS is in fact linear and consistent. -

Does DoMyJob() always 1000 frames? -

1 Respuestas

If DoMyJob_2 takes a variable amount of time, then you have a slice of time from every second that is not being taken into account. You could use your method to calculate an average time to execute DoMyJob_1, but not to determine frames per second. For example:

loop 1:
 task 1: 5ms
 reported fps: 1000/5ms = 200
 task 2: 15ms
 real fps: 1000/20ms = 50
loop 2:
 task 1: 5ms
 reported fps: 1000/5ms = 200
 task 2: 25ms
 real fps: 1000/30ms = 33
...

So I'm not sure that's what you are seeing, but it seems possible. What you are describing (fluctuating reported fps) might actually make more sense if the total length of the job tends to be stable, but the way you split the job makes each part variable.

Respondido 02 Feb 12, 03:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.