2012-07-10 11 views
5

En mi motor de juego, hay objetos que deben actualizarse periódicamente. Por ejemplo, una escena puede reducir su alfa, por lo que configuro un intervalo que lo haga. Además, la cámara a veces necesita sacudirse un poco, lo que requiere interpolación en la propiedad de rotación.Método de actualización de llamadas vs tener un setInterval

veo que hay dos maneras de hacer frente a estos problemas:

  1. tener un método de actualización() que llama a los métodos de actualización de todos los demás objetos. Los objetos rastrean el tiempo desde la última actualización y actúan en consecuencia.

  2. Haz un setInterval para el método de actualización de cada objeto.

¿Cuál es la mejor solución y por qué?

+1

No estoy calificado para responder, pero la mayoría de los ejemplos que he visto parecen favorecer a la opción 1. De esta forma, todos los objetos se actualizan con el mismo valor de tiempo de juego. Parece que si cada objeto tuviese su propio intervalo, las cosas podrían quedar "fuera de sincronización" si tiene sentido. – sellmeadog

+0

¿Cuál es exactamente la diferencia entre esas formas? En cualquier caso, el motor tiene que rastrear el tiempo. – Bergi

+0

+1 @sellmeadog. Definitivamente vaya con la opción 1. –

Respuesta

4

setInterval no se ajusta a un reloj, solo secuencias de eventos a medida que entran. Los navegadores tienden a mantener al menos una pequeña cantidad de tiempo entre los eventos. Entonces, si tienes 10 eventos que todos deben disparar después de 100 ms, es probable que veas el último evento de fuego dentro de los 200 ms. (Esto es bastante fácil de probar).

Tener solamente uno evento (y pidiendo información actualizada sobre todos los objetos) es, en este sentido mejor que tener cada objeto de establecer su propio intervalo. Sin embargo, puede haber otras consideraciones, pero al menos por esta razón, la opción 2 es inviable.

Aquí es un poco más sobre setIntervalHow do browsers determine what time setInterval should use?

1

La mejor manera que he encontrado para hacer una buena función de actualización() y mantener una buena velocidad de fotogramas y menos carga es de la siguiente manera.

Tiene un único método update() que dibuja su marco, mediante el bucle de algún tipo de cola/calendario de todos los objetos dibujables su propia función update() que se agregan a esta cola/calendario de eventos de actualización. (eventlistener)

De esta forma no es necesario buclear todos los objetos que no están programados para un redibujado/actualización (como botones de menú o cruz). Y no tienes una gran abundancia de intervalos corriendo para todos los objetos dibujables.

0

Recomiendo usar el método update() sobre el setInterval.

Además, supongo que el tiempo en los varios setintervals en ejecución sería poco fiable.

Otra posibilidad, dependiendo de qué otras cosas están sucediendo en su juego, utilizando un grupo de intervalos separados podría introducir condiciones de carrera en el recuento y comparación de puntuación, etc.

+0

No lo adivine, el tiempo con setInterval/Timeout * es * no confiable. – Bergi

0

Los algoritmos propuestos propuestas no son exclusivos de la método relacionado. Es decir, puede usar setInteval para llamar a todos los métodos de actualización, o puede hacer que cada objeto se actualice llamando repetidamente a setTimeout.

Más al punto es que un solo temporizador es menos sobrecarga que múltiples temporizadores (de cualquier tipo). Esto realmente importa cuando tienes muchos temporizadores. Por otro lado, es posible que solo un temporizador sea adecuado, ya que es posible que algunos objetos deban actualizarse con más frecuencia que otros o con un cronograma diferente, así que intente minimizarlos.

Una ventaja de setTimeout es que el intervalo para la próxima llamada se puede ajustar para cumplir con los requisitos de programación específicos, p. si uno se retrasa puede saltear el siguiente o hacerlo antes. setInterval se desplazará lentamente en relación con un reloj constante y uno de los ajustes será más difícil.

Por otro lado, setInteval solo necesita ser llamado una vez para que no tenga que seguir llamando al temporizador. Puede terminar con una combinación.

Cuestiones relacionadas