Frame Independent o No Frame Independent?
5 04 2009
Desarrollando en ActionScript me he visto tentado a imitar lenguajes mas maduros lo cual me ha llevado a resultados que no son siempre los deseados.
Por ejemplo, en DirectX los objetos tienen dos propiedades Update y Draw. La propiedad Update se ejecuta(en teoría) cada un intervalo determinado de tiempo, que es siempre el mismo(en realidad, no es mas rápido de lo que se le pide). En cambio, la función Draw se ejecuta tan rápido como sea posible.
Lo que se trata de buscar con esto, es que en la gran diversidad de configuraciones que existen en el mundo de las pc’s, un determinado evento en un juego se mueva casi a la misma velocidad en una máquina superrapida que en una máquina de menores prestaciones(esencial en juegos multiplayer!!).
Esto es especialmente importante en la simulación de sistemas físicos, en las que los objetos deben comportarse no solo de forma similar en distintas máquinas, sino que deben comportarse igual que como se verían en la realidad.
Si no se implementara lo anterior, en un juego de carreras de coches que corra en una máquina de pocos megahertz el jugador sentiría que va en cámara lenta, mientras que en una máquina de ultima generación el mundo iría tan rápido que sería injugable.
Queriendo implementar lo mismo en actionscript, generé una función update que se ejecutaba en el evento TIMER de la clase homónima en lugar de poner el mainloop en el enterFrame de la película.
Si bien los objetos recorrían la misma distancia en idéntica cantidad de tiempo, las animaciones producidas eran de baja calidad. Por ejemplo, el rebote de una pelota se veía tosco, ya que faltaban cuadros.
Pese a que a la rutina timer le puse un intervalo de ejecución muy pequeño(un milisegundo) me pasaba que no solo el intervalo se ejecutaba a un ritmo muy inferior al que yo decía(lo cual es perdonable) sino que se ejecutaba de forma extremadamente irregular comparado con las rutinas enterframe.
Lo que yo recomiendo es que, dado que uno propone y flash dispone, utilicen los eventos enterFrame para el mainloop del juego, ya que son mas confiables y tienen mas prioridad que los llamadas a otras rutinas del tipo Timer o SetInterval.
Para terminar, utilicen rutinas frameIndependent solo si es absolutamente necesario(por ejemplo, en juegos multiplayer) ya que siempre es preferible que el juego ande mas lento a que se salte cuadros.
Saludos!







