Pregunta

entiendo por qué lo hace, pero que realmente no tienen idea de cómo evitarlo. Por lo que el escenario es, cada cuadro que mover el coche por un determinado de píxeles predefinidos. Lo que pasa es cuando voy en equipo lento o más rápido ... así me sale menos o más fotogramas por segundo por lo que el coche se mueve más lento o más rápido. Me preguntaba cómo podía evitarlo.

Me sospechar que iba a tener el mismo problema usando cualquier biblioteca ... Esta es mi primera vez haciendo cosas en tiempo real por el estilo.

¿Fue útil?

Solución

Sospecho que su código actual se parece de alguna manera como este

 // to be called every frame
 void OnEveryFrame()
 {
     MoveCar();
     DrawCarToScreen();
 }

Pero debería ser así:

 // to be called - for example - 50 times per second:
 void OnEveryTimerEvent()
 {
     MoveCar();
 }

 // to be called every frame
 void OnEveryFrame()
 {
     LockTimerEvents();
     DrawCarToScreen();
     UnlockAndProcessOutstandingTimerEvents();
 }

Hay que establecer un evento de temporizador de acuerdo, por supuesto.

Otros consejos

coche se mueven de acuerdo a los temporizadores y no de imágenes por segundo. es decir, el modelo de coche debe ser independiente de la representación de visualización.

Puede resolver esto mediante el uso temporizadores precisos y matemáticas vectoriales.

Así que, por el bien del argumento permite sugerir su código de dibujo podría ser llamado en cualquier punto en el tiempo, por ejemplo, 1 segundo aparte o 3 segundos aparte o 0,02 segundos de diferencia.

Tomar la velocidad de movimiento del automóvil para ser 40 píxeles por segundo.

Por lo tanto, el número de píxeles que deben moverse es. (TIME_NOW - LAST_FRAME_TIME) * 40 píxeles

El movimiento debe ser limitada por un retardo de tiempo "real", es decir, el coche se mueve a la velocidad de x píxeles por división de tiempo.

Leer el reloj de tiempo real, y mover el coche una distancia apropiada por el tiempo transcurrido. Esto puede parecer un tanto "desigual" si el equipo es demasiado lento, pero hace que la velocidad de la cabina independiente de la velocidad de la CPU.

Es necesario limitar la velocidad de fotogramas a X fotogramas por segundo (FPS 60 es el más común). Esta es una característica común en la mayoría de los marcos multimedia, incluyendo SFML. Para SFML Me miro en el método / RenderWindow ventana SetFramerateLimit (unsigned int límite) .

Es necesario que arreglar el paso de tiempo . Básicamente, cada fotograma que mover el coche una distancia que varía en función de la cantidad de tiempo transcurrido en realidad desde la última llamada actualización. De esta manera, se obtiene la velocidad correcta independientemente de la velocidad de fotogramas.

Hay que salvar el tiempo antes de coche y dibujos en movimiento.
Ahorrar el tiempo después de que todos los cálculos.
Mover el coche por Npixels / segundo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top