PDA

Ver la Versión Completa : Duda con Delta Time


rinxe
26/02/13, 17:49:03
He empezado hace poco a programar juegos y por lo tanto a usar el deltaTime que me trae un poco de cabeza, pero le voy cogiendo algo de marcha.

Entonces estoy programando una especie de animaciones en un tiempo determinado (de X segundos a Y segundos). De momento en mi movil se ven bien esas animaciones, excepto alguna vez que se salta algun fotograma (supongo que sera por el procesador que baja de ritmo ¿?¿).

Y mi duda es que si el Delta Time corre en todos terminales igual?? En teoria las animaciones que estoy programando se verian bien en los demas terminales?? Llevo poco tiempo en esto y a penas he podido hacer pruebas en otros terminales.

mocelet
26/02/13, 23:14:37
El delta time es el tiempo que ha pasado entre el frame que se va a dibujar y el frame que se dibujó justo antes. Por supuesto que NO es igual en todos los terminales, ni siquiera en un mismo terminal, porque los frames por segundo nunca son constantes.

Pero si tu animación está bien hecha, es decir, teniendo en cuenta el tiempo que ha pasado desde el último frame para pintar lo que sea en su posición correcta, entonces se verá bien en cualquier terminal a cualquier ritmo de actualización de frames.

rinxe
27/02/13, 12:32:02
Okk, creo que ya se por donde van los tiros. Las animaciones en si, con las pruebas que he estado haciendo, creo que he dado con un valor entre una imagen y otra bastante bueno. Ya no me pierde ningun fotograma.

Supongo que los frames por segundo dependeran del terminal, a que velocidad pueda moverlos. Por decirlo de alguna manera, la animacion ira mas rapida o mas lenta, eso ya dependera del terminal no??

kriogeN
27/02/13, 13:08:54
Android tiene una tasa máxima de 60 fps, es decir, los onDraw los ejecuta como máximo 60 veces por segundo.

No se que estarás usando, yo uso SurfaceView, y obviamente la tasa dependerá del terminal, cuanto más código tenga que ejecutar entre frames menos tasa tendrá. Lo que hay que hacer para asegurarte una tasa máxima es ejecutar todas las operaciones de cálculo fuera del onDraw, y en el onDraw dedicarte únicamente a pintar.

mocelet
27/02/13, 13:29:41
¿A qué llamas exactamente que la animación vaya más rápida o más lenta? La velocidad de un juego no puede depender del terminal ni de cuántas frames se dibujen, depende del tiempo.

Si el personaje tiene que ir del punto A del juego al punto B en 3 segundos, tiene que tardar 3 segundos, dibujes más frames o menos por el camino. No puede ser que en un terminal de gama baja vaya a cámara lenta... y en un super terminal de dentro de un año parezca un relámpago.

rinxe
27/02/13, 19:50:20
Mas o menos me hago una idea, lo que pasa es que no controlo mucho de estos temas y voy algo perdido.

Estoy usando la base del libro y de los videos de OutKast. Y para pintar si que se usa el SurfaceView.

Y tiene dos metodos (update y present) y estan en continua actualizacion por el deltaTime. Lo que hago es presentar las imagenes en el metodo present, las quito con true o false y las animo poniendo un tiempo a 0. De 0 a 20 se ven 4-5 imagenes en varias posiciones.

De momento el tema animaciones pinta bastante way aunque aun me falta implementar unas cuantas ideas mas que tengo, pero poco a poco, jejejj.

Ahora estoy tocando la logica que me lleva un poco mareado pero bueno..

Otra cosa que me da miedo y que no se como va a salir, es el tema de gasto de recursos o RAM,

rinxe
28/02/13, 15:06:41
Bueno pues la logica ya la tengo dominada, ayer tuve un momento de inspiracion, jejejj. Me queda implementarla pero ya he dado con la formula.

Lo que me queda una duda con el delta tieme. Cual es la mejor forma de llamar a un metodo cuando usas deltaTime?? Porque al estar trabajando con el deltatime, si ese metodo esta dentro del delta time, se va a repetir continuamente.

Yo lo que hago es poner un tiempo a 0 y cuando llega a X segundos, entra en accion ese metodo y dentro de este metodo al final lo pongo a false para que no actue mas veces hasta nuevo aviso.

mocelet
28/02/13, 15:51:41
El deltaTime, salvo que estemos hablando de otra cosa, es una variable con el tiempo que ha pasado desde la última vez que calculaste el estado de las cosas, ¿no? Por eso es delta, ni siquiera es un tiempo absoluto.

No he entendido lo de que haya un método dentro del deltaTime, eso es solo una variable.

rinxe
28/02/13, 16:30:20
Sii, quizas me he explicado mal. El delta time lo calculo y lo guardo en una variable.

Luego digamos que tengo los metodos que comentaba antes (update y present) a los que les aplico el deltatime para que esten en continua actualizacion. Por lo tanto en cada tick del deltatime, estos metodos son llamados.

Con eso consigo un surfaceview actualizado en cada tick del deltaTime. Que es donde presento las imagenes, animaciones u oculto imagenes a traves de esos metodos (update, present).

Entonces el problema es que cuando hago una llamada a un metodo dentro del update o present, si no controlo bien el tiempo, ese metodo puede ser llamado 2,3,4,5.. veces

No se me a ocurrido otra forma de hacerlo y como de momento me estan saliendo las cosas no le doy mucha importancia, pero es algo complicado manejarse con el deltaTime en continua actualizacion.

mocelet
28/02/13, 17:01:40
Si cada cosa animada que tengas es un objeto, en cada tick llamas al update(delta) de todos los objetos.

Cada objeto ya sabe qué tiene que hacer, si es un objeto animado con velocidad V pues la nueva posicion es la de antes más V x delta. Si no tiene que moverse su velocidad es cero.

Si lo organizas bien no deberías tener problemas.

rinxe
28/02/13, 18:07:22
Mas o menos me voy apañando con el deltaTime, pero aun no tengo muy claro como se usa. De momento voy aprendiendo cosillas

Haber si termino el jueguecillo que estoy haciendo y os lo enseñare haber que tal a salido la cosa. Aun me queda bastante por hacer, de momento llevo la logica y la pantalla de juego.

Truebaj
03/03/13, 16:54:52
El concepto de deltaTime como dicen es el tiempo que ha pasado desde el ultimo frame hasta el que se va a pintar y no es el mismo casi nunca (de casualidad alguna vez igual es el mismo pero rara vez) ni en tu terminal ni en cualquier otro que pruebes tu aplicación.

La cosa es usar el deltaTime para calcular variables que cambian en el tiempo. Por ejemplo los pixeles que tienes que mover un personaje.

Imagina que tienes una imagen de un personaje que tiene que moverse 300 pixeles en el eje X en 1 segundo (300px/segundo). Usando el deltaTime que te da los segundos desde tu ultimo frame (no se si te lo dará en segundos, milisegundos o que unidad de tiempo pero supón para este ejemplo que te los da en segundos) puedes calcular cuantos pixeles tienes que desplazarte en ese periodo de tiempo haciendo (300 x deltaTime).

300 x 0,016 = 4,8 pixeles en 0,016 segundos

El problema es que deltaTime una vez serán 0,016, otra 0,023, otra 0,010, etc... Por ello haciendo la multiplicación 300 x deltaTime calculamos cuanto nos tenemos que desplazar este frame.

300 x 0,023 = 6,9 pixeles en 0,023 segundos
300 x 0,010 = 3 pixeles en 0,010 segundos

Realizando esto nos aseguramos que en 1 segundos nos hayamos desplazado 300 pixeles.

No se si esta muy claro. Si no es así pregunta cualquier cosa :)