En nuestro camino para conseguir el maximo numero posible de fps en nuestro juego debemos tener en cuenta la sincronizacion vertical de la tarjeta de video con el monitor, lo que comunmente se denomina VSync (Vertical Synchronization). Para comprender que es el VSync necesitamos algunos conocimientos basicos de como funcionan las tarjetas de video.Durante la generacion de cada fotograma, la tarjeta de video no dibuja los objetos del juego directamente en la pantalla, ya que entonces veriamos los objetos ir apareciendo uno tras otro. En lugar de eso, los objetos se dibujan en una zona especial de la memoria de video llamada back buffer, y cuando se ha terminado de pintar, el back buffer se copia a otra zona de memoria llamada frame buffer. Periodicamente el monitor actualiza la pantalla con el contenido del frame buffer. El tiempo de refresco del monitor es numero de veces que el monitor actualiza la pantalla con el contenido del frame buffer, se mide en Hz (1 Hz = 1 vez por segundo), y en la mayoria de los monitores esta entre 60 y 120 Hz. No hay que confundir por tanto la velocidad de pintado de la tarjeta de video (fps) con el tiempo de refresco del monitor (Hz), ya que son conceptos diferentes. Por muchos fps que este dando nuestra tarjeta de video, el numero maximo de fotogramas diferentes que veremos en pantalla estara limitado por el tiempo de refresco del monitor.
Tearing
El tearing es un efecto visual no deseado, que se presenta cuando el monitor y la tarjeta de video no estan sincronizados. Si mientras el monitor esta actualizando la pantalla con los datos del frame buffer la tarjeta de video cambia el contenido del frame buffer, el fotograma que el usuario vera en pantalla estara compuesto por dos trozos de fotograma distintos, la parte superior de uno y la parte inferior de otro. El VSync es un metodo ideado para resolver este problema, basado en que la tarjeta de video solo podra actualizar el contenido del frame buffer cuando el monitor se lo permita, justo despues de acabar de pintar en pantalla, es decir, se sincroniza el funcionamiento de la tarjeta de video con el monitor.
El problema del VSync
En principio, el VSync resuelve el problema de tearing, pero introduce un nuevo problema de rendimiento. Supongamos que tenemos el VSync activado, nuestro monitor tiene un tiempo de refresco de 75Hz, y nuestra tarjeta grafica esta dando 60 fps. En estas condiciones, el monitor actualiza la pantalla cada 13.33 ms y la tarjeta de video actualiza el frame buffer cada 16.66 ms. El proceso que se seguiria seria el siguiente:
- El monitor comienza a pintar el contenido del frame buffer en pantalla y la tarjeta de video comienza a pintar en el backbuffer
- A los 13.33 ms el monitor termina de pintar en pantalla e indica a la tarjeta de video que puede actualizar el frame buffer. Sin embargo, la tarjeta de video aun no ha terminado de pintar en el back buffer, con lo que el frame buffer no se actualiza aun. El monitor comienza a pintar en pantalla otra vez, con el frame buffer sin modificar (es decir, volvera a pintar lo mismo)
- A los 16.66 ms la tarjeta de video termina de pintar, pero para actualizar el frame buffer debe esperar a que el monitor termine. Es decir, debe esperar (13.33 x 2 - 16.66) = 10 ms para poder actualizar el frame buffer y poder comenzar a pintar de nuevo en el back buffer. Estos 10 ms son tiempo absolutamente desaprovechado por la tarjeta grafica.
- A los 26.66 ms el monitor termina de pintar en pantalla e indica a la tarjeta de video que puede actualizar el frame buffer. Esta vez si se produce la actualizacion del frame buffer y todo el proceso vuelve a comenzar de nuevo.
Triple Buffer
El triple buffer se usa para evitar la perdida de rendimiento al activar el VSync. Se basa en que la tarjeta de video utilice dos back buffers para pintar en lugar de uno solo, de forma que cuando ha terminado de pintar un frame, en lugar de esperar a que el monitor le permita actualizar el frame buffer sin hacer nada, puede continuar pintando en el otro back buffer. Activando el triple buffer obtendremos la misma velocidad que si no tuviesemos el VSync activado, y evitaremos tambien el problema del tearing. Pero como no, el triple buffer tiene tambien su contrapartida, ya que cada back buffer consume bastante memoria de video. Con una resolucion de 1600x1200x32 el tamaño de cada buffer es de unos 7.5 Mb. Aunque 7.5 Mb no parecen demasiado para una tarjeta de video con 256 o 512 Mb, el problema se agrava si queremos activar el antialiasing. Si usamos el FSAA 4x, debemos multiplicar el tamaño de cada buffer por 4, con lo que nuestros 7.5 Mb pasan a ser 30 Mb. Y no olvidemos que, como su nombre indica, con el triple buffer activado tenemos 3 buffers (el frame buffer y los dos back buffers), lo cual nos deja ya en 90 Mb... y eso ya duele mas verdad?
Conclusion
Entonces, es bueno activar el VSync o no? Pues depende del caso concreto:
- Si tu tarjeta de video es muy rapida y siempre va mas rapido que el monitor (es decir, tiene mas fps que Hz el monitor), puedes activar el VSync para mejorar la calidad visual sin problemas de perdida de rendimiento. Solo asegurate de que tus grafica sea realmente rapida y en ningun momento del juego bajen los fps por debajo de los Hz. En este caso no deberias tener el triple buffer activo, ya que solo conseguirias consumir mas memoria sin mejora alguna.
- Si tu tarjeta de video es lenta y va mas despacio que el monitor, yo recomendaria no activar el VSync. Si para ti el tearing resulta demasiado molesto puedes probar a activar el VSync, pero activando tambien el triple buffer para mejorar el rendimiento.
- Si lo que quieres es hacer una prueba de rendimiento, por ejemplo para saber como de rapida es tu tarjeta de video, entonces debes desactivar VSync, en caso contrario el numero maximo de fps que obtendrias seria como mucho el numero de Hz de tu monitor.
En el apartado de opciones graficas del Counter Strike Source podemos activar o desactivar el VSync, pero no existe la opcion de activar el triple buffer. Sin embargo, y al menos con las tarjetas NVidia, podemos forzar el uso del triple buffer usando el panel de control de la tarjeta de video.
Vertical Synchronization
How VSync works, and why people loahte it
Unraveling the mystery of VSYNC
4 comentarios:
Impresionante entrada Petrus. Muy útil e interesante.
Un saludo,
Gabriel
Que bueno tio! Me has dejado muy claros varios conceptos que conocía pero no sabía exactamente cómo funcionaban ni sus efectos.
Un abrazo!
Edy
Pero ¿Qué pasa con los monitores TFT? He oído que no tienen señal de VSync pero, sin embargo, si desactivo la sincronización de mi tarjeta el efecto chungo de ver la pantalla partida se ve. Un poco de luz en tanta oscuridad por favor XDDD
Un saludo majete.
La explicación es genial. Más claro imposible, pero te diré que en DirectX no funciona el Triple Buffer, solo lo hace en openGL por mucho que lo actives en el panel de control de Nvidia.
http://foro.tombraiderfans.es/index.php?s=&showtopic=16543&view=findpost&p=273907
En este link explico una forma sencilla de poder activar el triple buffer y de ese modo acelerar todos los juegos bajo DirectX
Publicar un comentario