reinterpretcast
En el ejemplo anterior puede parecer inicialmente que una tasa de refresco de 0,26 Hz y una velocidad de fotogramas de 0,2 FPS (Frames Per Second) podrían estar lo suficientemente cerca para mostrarse correctamente, sin embargo, está claro viendo la ejecución de la demo que los dos están completamente fuera de sincronización y, por lo tanto, el screen tearing se produce con regularidad.
El verdadero problema con este ejemplo es que es una ‘aplicación de un solo buffer’. Escribimos nuestros fotogramas directamente en el buffer que se alimenta a la pantalla, por lo que cuando la pantalla quiere refrescar su imagen, existe el riesgo de que reciba un fotograma que aún no está completamente terminado. En una aplicación real la velocidad de fotogramas a menudo puede cambiar drásticamente dependiendo de ciertas circunstancias, lo que puede empeorar este problema en las aplicaciones de un solo búfer y hacer que el desgarro de la pantalla sea aún más impredecible.
Double Buffering
Una forma de aliviar algunos de estos problemas es utilizar el doble búfer. Este método de dibujo consiste en escribir los datos de los fotogramas en un búfer trasero, y luego copiarlos en el búfer primario (la alimentación de vídeo a la pantalla) sólo cuando un fotograma está completo. De este modo, el usuario nunca verá ningún fotograma a medio completar, ¿verdad? Error.
Aunque el tearing de la pantalla tiende a reducirse significativamente con el doble buffer, la copia de datos lleva su tiempo, y por ello es completamente posible que el monitor refresque su imagen a mitad del proceso de copia del buffer. Este problema puede visualizarse exactamente igual que el tearing con un solo búfer: en la demostración anterior, imagine que los píxeles que se escriben en el búfer primario no son generados directamente por la tarjeta gráfica, sino que se colocan en el búfer secuencialmente como resultado de una operación de copia desde un búfer secundario.
Doble búfer + VSync
Otra táctica de alivio es utilizar VSync. Abreviatura de «sincronización vertical», VSync funciona dejando que el búfer posterior escriba en el búfer primario sólo después de que la pantalla se haya actualizado. El objetivo es que la operación de copia del búfer se complete antes de la siguiente actualización. Esto funciona reduciendo drásticamente el tearing de la pantalla, pero tiene sus problemas.
Si tienes una aplicación de alta velocidad de fotogramas, VSync suele funcionar perfectamente. Su velocidad de fotogramas se limita a la tasa de refresco de su monitor, pero eso está bien porque su monitor estaría mostrando a esa tasa de todos modos. El problema viene cuando consigues una velocidad de fotogramas inferior a la tasa de refresco de tu pantalla.
Supongamos que consigues 60 FPS en un monitor de 75 Hz – eso significa que el buffer de fotogramas se actualiza al 80% de la tasa de refresco. Si VSync está activado, los fotogramas deben copiarse en el buffer de pantalla a una subdivisión de la tasa de refresco. En este caso, la aplicación perderá la «fecha límite» cada dos ciclos, por lo que terminaremos con la mitad de la tasa de refresco como nuestra velocidad de fotogramas: 37,5 FPS. Esto es significativamente menor que los 60 FPS que la tarjeta gráfica puede lograr.
El TL;DR para VSync de doble búfer es que si usted logra un FPS consistentemente más alto que su tasa de refresco, puede ser una buena idea para reducir el desgarro de la pantalla, pero si el FPS caerá por debajo de la tasa de refresco de su pantalla, VSync puede reducir significativamente los FPS.
Triple Buffering + VSync
El santo grial de todo este lío suele ser el triple buffering con VSync. El límite de VSync con doble buffering es que el framerate puede disminuir significativamente debido al tiempo de espera del momento adecuado para copiar el buffer secundario en el primario. La espera no suele ser una idea fantástica en informática cuando se puede evitar, por lo que una solución en este caso es simplemente añadir otro búfer.
Con tres búferes, los dos búferes posteriores se pueden dibujar alternativamente para que siempre se dé el caso de que un búfer esté completo y otro en proceso. Esto significa que, justo después de una actualización del monitor, el búfer que esté completo en ese momento puede copiarse al búfer principal, lo que proporciona las ventajas de VSync sin la desventaja de la velocidad de fotogramas comentada anteriormente.
La principal desventaja del triple búfer, cuando está disponible en las aplicaciones, es que ocupa más memoria; si hablamos de tarjetas gráficas, esto significa más VRAM (RAM de vídeo). Se trata de una memoria rápida utilizada directamente por la tarjeta gráfica, por lo que, en algunos casos, el triple buffering podría provocar una importante caída de FPS mientras se utiliza una RAM de mayor latencia para compensar la falta de VRAM nativa. Por lo general, esto no supone un gran problema, ya que la cantidad de memoria que ocupa el tercer búfer suele ser pequeña en comparación con el tamaño total de la VRAM; sin embargo, VSync con sólo dos búferes puede proporcionar una mejor velocidad de fotogramas en algunos casos muy específicos. Todo depende de los cambios que se produzcan, ¿no?