Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con la sincronización vertical.

Iniciado por Pepius, 06 de Agosto de 2011, 03:23:58 PM

« anterior - próximo »

Pepius

Buenas otra vez,

Haciendo pruebas con mi motor, hace tiempo ya que observo unos pequeños saltos en la animación bastante molestos. Analizando el problema he observado que esos saltos coinciden con un salto de 60 fps a 30 fps. Según he investigado esto es causado por la sincronización vertical, que provoca que los fps sean uno de esos dos valores.

Por probar, desactivé la sincronización vertical mediante wglSwapIntervalEXT. El juego pasa a ir a 700 fps (cosa irrelevante, pues no se nota diferencia respecto a los 60) y, efectivamente, los saltos desaparecén.

Estoy seguro que desactivar la sincronización vertical no tiene que ser la solución, alguna idea por ahi o alguien que haya tenido el mismo problema?

Gracias, un saludo!

[EX3]

Cita de: Pepius en 06 de Agosto de 2011, 03:23:58 PM
Por probar, desactivé la sincronización vertical mediante wglSwapIntervalEXT. El juego pasa a ir a 700 fps (cosa irrelevante, pues no se nota diferencia respecto a los 60) y, efectivamente, los saltos desaparecén.
Lo que tienes que hacer es controlar la tasa de actualizacion maxima de fotogramas. Dejarlo sin control hace pueda subir a 700fps en tu maquina pero vaya distinta en otra, sin ser estable, ya que depende de muchos factores inclusive externos a las propias funciones de render, y eso si se nota y afecta al manejo del juego en general. Lo idoneo es que mantengas unos 60fps estables como maximo y un minimo de 30fps para mantener fluidez.

La espera de refresco vertical lo que evita es que se pinten incompletamente la escena en pantalla, si lo desactivas puedes encontrar a veces que no se haya terminado de pintar el fotograma y haya empezado a pintarse el siguiente quedando como partida la escena en pantalla. Activando la espera de refresco logras que no se pinte el siguiente fotograma hasta haber completado el otro, lo que también logra que tu tasa de actualización en pantalla sea fija o al menos estable.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Pepius

Si, tenía pensado limitarlo. A lo que me refería es que ni la animación ni los logic ticks ni las físicas son dependientes del framerate en el sentido de que el funcionamiento no es diferente (no aumenta la velocidad de los objetos con el framerate, por ejemplo).

El problema de tener el vsync activado es que, si no lo he entendido mal, fuerza tus fps a (en tasas de refresco habituales) 60, 30, 15... fps. Entonces me encuentro con el problema de que cada X frames (un intérvalo no fijo) hay un frame que baja de los 60 a los 30, causando un salto muy incómodo para los ojos.

No se si me he explicado.  ^_^'

[EX3]

Cita de: Pepius en 06 de Agosto de 2011, 05:50:07 PM
Si, tenía pensado limitarlo. A lo que me refería es que ni la animación ni los logic ticks ni las físicas son dependientes del framerate en el sentido de que el funcionamiento no es diferente (no aumenta la velocidad de los objetos con el framerate, por ejemplo).
Salvo que me digas que el render lo ejecutas en un hilo a parte del resto de la logica si que afecta al resto de codigo de tu juego. Si tu render da saltos los tiempos de actualizacion son variables a la hora de ejecutar la logica (fisicas, ia y lo que haya detras). Si es importante tener controlado el maximo de fotogramas por estos temas.

Ayer mismo, yo estaba haciendo pruebas de ejecutar videos de fondo como textura en un proyecto que estamos haciendo y el resultado es que el video, por temas de resolucion y peso, bajaba los fps por debajo de 20, ocasionando que las colisiones y movimientos se ejecutaran con mas lentitud.

Cita de: Pepius en 06 de Agosto de 2011, 05:50:07 PM
El problema de tener el vsync activado es que, si no lo he entendido mal, fuerza tus fps a (en tasas de refresco habituales) 60, 30, 15... fps. Entonces me encuentro con el problema de que cada X frames (un intérvalo no fijo) hay un frame que baja de los 60 a los 30, causando un salto muy incómodo para los ojos.
No, el vSync lo que hace en todo caso es ajustar la tasa de refresco a la del monitor como un maximo (60 o 50 generalmente), pero no deberias tener saltos raros en la actualizacion salvo que tu codigo lo genere por alguna llamada concreta que tarde en ejecutarse.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Pepius

Interesante lo que comentas, gracias por la info.

No entiendo entonces ese salto espontáneo que hace, porque no pasa en ningún momento en concreto, es decir, no es porque haya más entidades en pantalla ni nada por el estilo. Intentaré investigar más, alguna idea de como trackear el problema?

Un saludo!

fjfnaranjo

Sobre el vsync:

Yo lo que tengo entendido por sincronización vertical es lo siguiente.

En los monitores, por restricciones de hardware o de forma de la tecnología, la imagen que debe mostrarse en el monitor se envía mediante un scan vertical, línea a línea, desde los emisores de luz a las distintas componentes de color que forman la pantalla.

Esto, en determinado monitores, que por su refresco variable o no síncrono con la velocidad de dicho scan, hace que se observen unas franjas de varias anchuras bajando con la pantalla, que se forman por la colisión de dos emisiones de líneas de diferentes instantes de las imágenes (creo que esto pasa en los TFT debido a que un pixel necesita un tiempo físico real para "enfriarse" y perder el color).

Para evitar esto, el vscan fuerza al hardware de video a esperar a que se haya enviado al dispositivo una imagen completa (o frame, pa entendernos) antes de enviar la siguiente, y se asegura de hacer la pausa de refresco sincronizada con el último envío de imagen al monitor, dando la oportunidad a este a que limpie una línea antes de que la siguiente se pinte.

Esto es lo que yo se, puedo estar equivocado en algo o todo, así que no me hago responsable de posibles muertes por uso accidental de esta información  :P y debe ser confirmada y no tomada automáticamente como cierta, por no decir que son las 5 de la mañana...
fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.