Escribí un componente para mostrar el FPS actual.
La parte más importante de la misma es:¿Cómo calcular correctamente FPS en XNA?
public override void Update(GameTime gameTime)
{
elapseTime += (float)gameTime.ElapsedRealTime.TotalSeconds;
frameCounter++;
if (elapseTime > 1)
{
FPS = frameCounter;
frameCounter = 0;
elapseTime = 0;
}
base.Update(gameTime);
}
public override void Draw(GameTime gameTime)
{
spriteBatch.Begin();
spriteBatch.DrawString(font, "FPS " + ((int)FPS).ToString(), position, color, 0, origin, scale, SpriteEffects.None, 0);
spriteBatch.End();
base.Draw(gameTime);
}
En la mayoría de los casos funciona bien, pero recientemente he tenido un problema.
Cuando pongo el siguiente código en el método de actualización del juego, algo extraño comienza a suceder.
if (threadPath == null || threadPath.ThreadState != ThreadState.Running)
{
ThreadStart ts = new ThreadStart(current.PathFinder.FindPaths);
threadPath = new Thread(ts);
threadPath.Priority = ThreadPriority.Highest;
threadPath.Start();
}
La idea principal de este código es ejecutar el algoritmo PathFinding en diferentes hilos todo el tiempo.
Por cosas extrañas quiero decir que a veces el FPS disminuye drásticamente, esto es obvio, pero el FPS mostrado cambia más de una vez por segundo. Si entiendo este código, FPS no puede cambiar más de una vez por segundo.
¿Alguien me puede explicar lo que está pasando?
Editar 26.03.2010
que he publicado también el código del método Draw.
Respuestas Editar 31.03.2010 a las preguntas Venesectrix
1) usted está funcionando con un intervalo de tiempo fijo o variable?
IsFixedTimeStep y SynchronizeWithVerticalRetrace se establece en verdadero.
2) ¿Estaba moviendo la ventana XNA cuando esto ocurrió?
No
3) ¿La ventana XNA tiene foco?
4) ¿Qué tan notable fue (es decir, actualizando tan rápido que no se puede leer, o simplemente se actualiza apenas más de un segundo)?
Pude leer las actualizaciones, el FPS se actualizaba ~ 3 veces por segundo.
5) ¿Y todo esto solo ocurre con el código de la secuencia ahí?
Sí
Una pequeña corrección, si (elapseTime> = 1) {FPS = frameCount/elapseTime; elapseTime = 0;} – Martin
Ah, y obviamente establezca framecount en cero – Martin
@Martin: Por supuesto, tiene razón, aumentará la precisión, pero no resolverá mi problema. Gracias de cualquier manera. –