Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Actualizar velocidad...

Iniciado por enelmenu, Enero 18, 2018, 11:33:03 PM

Tema anterior - Siguiente tema
Enero 18, 2018, 11:33:03 PM Ultima modificación: Enero 18, 2018, 11:37:18 PM por enelmenu
Hola, buen dia!
 
Tengo problemas con mover, el famoso deltatime, hay algo que no me cierra...
 
Que pasa con los fps(frames por segundo) que van mas rapido que otros (dependiendo el hadware)?

Como funciona esto?

Aunque vaya mas rapido o mas lento, no deberia ir siempre igual? en terminos "actualizacion de cada frame"
 
Por ejemplo... Quiero contar 1 2 3, con 1 segundo de intermedio, 1...2...3.... SI TENGO 60 fps.. 20fps... 15fps... 100fps... 300fps... QUIERO QUE AUQUE SE VEA PARA EL CULO CUENTE 1 2 3 en 3 segundos...
 
Como logro eso???
 
Por que me surgio esta duda?..
 
Bueno mi cuestion es la siguiente..

Me muevo de pi a pa llendo y viniendo, en un IEnumerator...

Que pasa.... cuando actualizo frame por frame me va bien... cuando dejo fluir el juego se vuelve loco...
 
Le puse mucho speed aproposito

Speed: 12


Estado: play


Estado: frame por frame

 
Script: https://ghostbin.com/paste/fnq8k
 
NO LE DEN BOLA AL "yield return new WaitForSeconds(0.2f)" Es para cuando este inabilitado actualize menos frames para rendimiento, pero es indiferente cuando empieza la secuencia de movimiento.
 
Que pasa?

Enero 19, 2018, 01:32:25 AM #1 Ultima modificación: Enero 19, 2018, 01:36:53 AM por lightbug
Cita de: enelmenu date=1516314783Tengo problemas con mover, el famoso deltatime, hay algo que no me cierra...
   
   
      Que pasa con los fps(frames por segundo) que van mas rapido que otros (dependiendo el hadware)?

      Como funciona esto?

      Aunque vaya mas rapido o mas lento, no deberia ir siempre igual? en terminos "actualizacion de cada frame"
   


Hola man! No pasa nada, si actualizas más rapido implica un deltaTime más chico, se traduce el desplazar menos. Lo contrario para HW "menos rápido", cual podría ser un riesgo? que en el HW menos rapido (mayor desplazamiento) el cubo que movés se mueva grandes distancias y puede ir a parar a lugares que no podés "controlar" (se me ocurre algo en lo que estaba haciendo yo, no digo que sea un problema de tu ejemplo, pero bueno, podría llegar a suceder).
 
Cita de: enelmenu date=1516314783Por ejemplo... Quiero contar 1 2 3, con 1 segundo de intermedio, 1...2...3.... SI TENGO 60 fps.. 20fps... 15fps... 100fps... 300fps... QUIERO QUE AUQUE SE VEA PARA EL CULO CUENTE 1 2 3 en 3 segundos...
   


Contar segundos tengas 100 fps o 10 fps debería ser lo mismo (no exactamente), por supuesto depende de como contés, si contas cada update seguro tengas un buen resultado(dependerá del vsync también) que si contas cada fixedUpdate (configurable), mientras menos refresco tenga tu ciclo mayor error, menor resolución, si querés contar 1 seg bueno va bien, pero si querés 1.02 seg quizás no sea tan exacto.
 
Si querés moverte (vamos a suponer una distancia "deltaPosFinal") y esperar 1 segundo (lo hice con Update pero con una corrutina daba igual, incluso en un fixedUpdate debería dar parecido... DT en FU es identico a fixedDT):
 
https://ghostbin.com/paste/t4c86
 
 
 
Cita de: enelmenu date=1516314783Script: https://ghostbin.com/paste/fnq8k
   
   
      NO LE DEN BOLA AL "yield return new WaitForSeconds(0.2f)" Es para cuando este inabilitado actualize menos frames para rendimiento, pero es indiferente cuando empieza la secuencia de movimiento.
   
   
      Que pasa?
   


 
 
No entiendo bien este script vs lo que querés arriba pero bueno, porque decís que el primer gif está bien, pero yo lo veo mal, no cuenta de a 1 segundo?. .. bueno, igual, algo que vi del código que quizás pueda dar algún problemita del tipo visual: acordate que cada vez que das a yield return null funciona parecido a salir del Update, es decir dentro de un while(1) (por ej) das al yield return null y es equivalente a dejar pasar el cuadro (para luego volver al while luego), que significa esto?, que tu "ratio" se actualizaría cuadro a cuadro, cuando vos estás presentandoló en FixedUpdate. Como resultado tenés algo que se actualiza cuadro a cuadro (en el while de la corrutina), modifcando un valor con el dT del fixedUpdate (el 0.02f que pusiste en la corrutina), presentado en el FixedUpdate...medio un lío, te va a quedar entrecortado quizás ande bien para cierto valores (dependiendo de los frames)
 
Por ej para entenderlo mejor: FixedUpdateInventado : 0.5 s , Update : obvio variando
 


  •    0.3s - pasa update (quedan 0.2s para FU), la corrutina calculó todo para el FU que todavía no pasó, le da que debe mover ---> speed(=1)* 0.5 = 0.5 unidades) .... sale de la corrutina.


  •    0.5s - pasa el fixed se presenta en pantalla (se movió 0.5 unidades)


  •    0.6s - pasa Update (quedan 0.4s para FU, fijate que a este ritmo se dará otro update en el medio... o más)  1 unidades


  •    0.8s pasa otro Update! ----> 1.5 unidades


  •    0.96s pasa otro Update! ----> 2 unidades


  •    1s pasa el segundo Fixed Update --> siguen las 2 unidades Se presenta en pantalla el movimiento de + 1 unidad (cuando debería haber sido 0.5 unidades para que quede suave y parejo).


Espero que se vea, por esta razón siempre que metés un fixed suele verse entrecortado el movimiento (aunque bien calculado supuestamente) y no suavizado (si es que mezclas a los dos, en tu ejemplo puede no ser muy obvio), si vás a usar fixed asegurate de actualizar el movimiento (el ratio tuyo) en FixedUpdate o maneja esto dentro de la corrutina. Incluso hay
 
Lo más fácil que podés hacer es pasarte al "cuadro a cuadro" (y seguir usando la corrutina, como en el código que te pase, si es que anda) , o en la misma corrutina ir "controlando" el dT deseado (el del FixedUpdate y dejar así como está) o hacerlo todo derecho en el Update o FixedUpdate (ya que sabés que en cada uno la cosa responde bien).
 
Saludos
 
PD: se viene kuboi 2D ?
 
 

Enero 19, 2018, 02:03:58 AM #2 Ultima modificación: Enero 19, 2018, 11:29:06 AM por pioj
Ouuuu me encanto esta respuesta siempre dandome altas datas jajaja te amo **************
 
Jajaja no explique nada, mande asi sequito todo, pense que era algo comun, pero se ve que no por lo que veo.
No se viene Kuboi hasta dentro de un par de meses... u.u tuve un alto problema... Me desperte un dia.. PUM no prende la maquina.... yo siempre la use destapada por que tengo unos coolers re chotos, resulta que veo la placa madre y tacate un manchon enorme de MEADA de mi gato!!!!!!!!!! me meo la placa madre!! me queria matarrr todo un dia limpiandola, al sol... pero nada la rescato.... resulta que tengo otra placa madre de una pc mooooy vieja cambie todo el hadware... PUM no arrancaba.... me comi la cabeza como un loco 2 dias tratando de saber que pasaba, resulta que el cortocircuito hizo que la placa por el meadon, quemo.. las memorias ram... el procesador... y lo mas importante... DISCO RIGIDO.... medio año de trabajo a la basura, y tenia cosas muuy valiosas yo hago diseño grafico tambien pum perdi todo, ningun backup nada nada de nada (apartir de ahora aprendi y uso google drive) pero estas cosas pasan, y mas cuando te pones a pensar como funciona un disco rigido, a la minima fallita mlimetrica pum perdes todo... hasta puede fallar solo de un dia para otro... asi que bueno jajajaja un garron, arme la viejita con todo lo viejito, procesador 2005 AMD 64 imaginate... jajajaja!! una ram de 2gb y lo que mas mas me salvo las papas, mi placa de video Nvidia gt 620 maomeno
 
Nada una mierda todo jajajaja te recomiendo usar un backup de lo importante broder no te dejes estar con esas cosas, uno no le da importancia hasta que se rescata o le pasan estas cosas
 
Asi que bueno, dada mis circustancias economicas y laborales, no me voy a poder comprar otra pc hasta este medio año, y decidi armar un juegito que tarde menos de 2 semanas, rapido y comercial, gratis y con publicidad para ganarme unos pesos a ver si me puede ayudar con mi hadware nuevo...
 
En fiin eso jajaja volviendo al tema de "Slider speed" se va a llamar jajajajaj una mierda pero bueno, es deslizar chocandote paredes y es modo run por tiempo, una cagada encima le copio un poco a "tom of the mask" pero nada de copyright, solo la idea
 
Bueno cucha, esto es asi, nose en que momento dije q el primer gif estaba bien pero no, en el primer gif esta el problema, donde el play va a muchos fps y se bugea todo mi movimiento.
El script es asi...
Primero que todo el 0.02f, lo puse de prueba fue un error no haber lo cambiado cuando lo subi, enrrealidad va (t += speed * Time.deltatime)
Yo al principio hice todo en la coroutina pero que pasa... Resulta que la coroutina se ejecuta despues del update... entonces me pasaba que el transform del objeto iba atrasado.... por que funciona asi:
Ejemplo frame 4:
Update: transform.x = 0.6f   frame 4;
IEnumerator: transform.x = 0.8f    frame 4;
 
Eso lo invente recien, cuestion que el update toma en el frame 5 lo del frame 4... nose si se entiende.
Entonces por este inconveniente cuando necesitaba DESDE OTRO script obtener el transform me iba desparejo... un frame atrasado...
Y decidi hacer todo el cambio de actualizacion en IEnuemrator y hacer el cambio de transform en el FU.
Esa es la razon, que opinas de eso? creo que mande cualquiera jajajaja
 
Bueno y resulta que cuando hago el movimiento y paso frame por frame con el mause, va bien, pero cuando dejo fluir el juego algo anda mal y nose que la verdad, yo en movement le digo cuando pingpong tiene que hacer de distancia, siempre es igual nunca cambia, nose es raroo!!!! no entiendo.
Y si decis de hacer un mathf.pingpong directamente no me sirbe por que yo hago todo esto tambien para tener informacion de cuando va y cuando viene, bien exacto,
 
 
Tengo que reformular todo? esa seria mi solucion? por que no le encuentro logica al asunto de volverse loquito el transform como el gif 1 y ahi se ve re poquito, pero si lo dejas va mas para la derecha despues vuelve a la izuqierda... hace lo que quiera...
 
Esto pasa cuando lo dejas mas tiempo:

Nuuuuu jajajaj maldito gato, hacelo al escabeche, es rico así (no te estoy jodiendo, lamentablemente). Y si, siempre hacé backup! yo tiro todo a Drive y listo.
 
Cita de: enelmenu date=1516323838nose en que momento dije q el primer gif estaba bien pero no,
   


 existe una alta probabilidad que lo haya inventado jaja (además me refería al gif lento, era el segundo entonces)
 
Cita de: enelmenu date=1516323838El script es asi...

      Primero que todo el 0.02f, lo puse de prueba fue un error no haber lo cambiado cuando lo subi, enrrealidad va (t += speed * Time.deltatime)

      Yo al principio hice todo en la coroutina pero que pasa... Resulta que la coroutina se ejecuta despues del update... entonces me pasaba que el transform del objeto iba atrasado.... por que funciona asi:

      Ejemplo frame 4:

      Update: transform.x = 0.6f   frame 4;

      IEnumerator: transform.x = 0.8f    frame 4;
   
   
      Eso lo invente recien, cuestion que el update toma en el frame 5 lo del frame 4... nose si se entiende.
   


Ah, bueno eso lo podés corregir directamente moviendo todo en la corrutina (o todo en el Update), no hay razón para chequear en uno y ejecutar en el otro (distinto fuera el caso de que tomás variables de entrada de interés en Update y aplicas fuerzas en FixedUpdate por ej).
 
Mira aca está lo mismo que te puse arriba pero algo tocado para hacer un "pingpong" pero vos elegís el tiempo de espera del step, deltaPos del step, y distancia final
 
https://ghostbin.com/paste/fpgtv
 
Probe con 5.47 unidades como ej, con diferentes tiempos y deltaPos (osea "velocidades")
 

 
 
 
Cita de: enelmenu date=1516323838Entonces por este inconveniente cuando necesitaba DESDE OTRO script obtener el transform me iba desparejo... un frame atrasado...

      Y decidi hacer todo el cambio de actualizacion en IEnuemrator y hacer el cambio de transform en el FU.


      Esa es la razon, que opinas de eso? creo que mande cualquiera jajajaja
   


Si necesitas desde otro script obtener la pos ya desplazada podés asegurarte de que el script en cuestión se ejecute después (ej en LateUpdate).
 
 

Muchas gracias Juancito feliz 2018 que tengas alto año amigo, exitos en lo que propongas!!


Ya lo solucione, efectivamente era eso trambolico que hice de separar los actualizadores de frames, nueva nota mental jajaja

Si voy a tener que usar lateUpdate para referirme al transform del objeto, quedo asi:

(El gizmo azul es cualquiera, es referencia para el principio nomas)


script por si a alguien le interesa :) 
https://ghostbin.com/paste/edepb


Abrazo cuidate!

Jaja de nada, igualmente para vos!
 
Saludos

Etiquetas: