miércoles, 26 de diciembre de 2012

Triple Buffer en Ubuntu



NOTA IMPORTANTE: Unade25 no apoya ni pretende promocionar el consumo irresponsable de bebidas alcohólicas. La historia descrita en este artículo se sirve de los comportamientos dipsómanos sólo como metáfora para facilitar la comprensión de ciertos conceptos tecnológicos. Si bebes no conduzcas, felices fiestas, etcétera. 


El vídeo-artículo de hoy puede ser de interés para aquellos que utilizan su ordenador como HTPC, es decir, que lo tienen en el salón (o donde quiera que tengan una tele, preferiblemente de las grandes y con un sistema de sonido decente) y lo usan casi exclusivamente como centro multimedia: para ver películas, escuchar música, ver y grabar televisión, etc.
Para este tipo de usuarios resulta fundamental que la visualización de los elementos de la pantalla (sobre todo en el caso de las películas) sea lo más suave y parecida a la experiencia "de cine real" que sea posible. A cambio, están dispuestos a renunciar a otros elementos, como por ejemplo una potencia exagerada en sus equipos, que por un lado no es necesaria, y que por otro conlleva un excesivo gasto eléctrico y mayores niveles de ruido debido a la necesidad de importantes elementos de refrigeración de los componentes. 
Durante mucho tiempo me encuadré a la perfección en esta tipología de usuario, y creo que la mayor parte de conocimientos que tengo sobre vídeo y hardware la he obtenido a través de lecturas relacionadas con el mundillo ultra geek del HTPC. 
Como de costumbre, el vídeo proporciona la información concreta para activar la opción de triple buffer de vuestras tarjetas gráficas. Por lo tanto, no hablaré del proceso en sí (al final del artículo dejaré los códigos para que podáis cortar y pegar cómodamente), sino que intentaré profundizar en el significado y la utilidad de este extraño concepto que es el triple buffer. 

Qué es un "buffer"

Creo que la mejor definición de "buffer" la he encontrado, cómo no, en la Wikipedia. Un buffer es un sistema que nos permite "almacenar información" que se está enviando desde un sitio a otro, mientras la información más antigua está siendo utilizada. La metáfora que dan en la wiki me parece acertada, así que intentaré proporcionar otra más pero a la manera de Unade25. Imaginemos que estamos en el interior de un Bar de carretera en la frontera entre México y Texas. En dicho establecimiento se encuentra una mujer de edad indefinida y catadura sospechosa que es nuestro único recurso para poder satisfacer nuestras naturales pulsiones masculinas. La situación no sería delicada sino fuese por nuestro insufrible sentido de la moralidad, que nos impele a no seducir mujeres desconocidas sin las debidas precauciones. Para aplacar el maldito angelito de nuestro hombro derecho, y conceder los deseos del diablillo del izquierdo, tomamos una medida de urgencia: emborracharnos a base de tequila. Teniendo en cuenta que somos hombres recios y de pelo en pecho (de otra manera no duraríamos demasiado tiempo en semejante escenario), calculamos que necesitaremos más de una botella del transparente jarabe mexicano para obtener el conveniente estado de obnubilación y tontuna que adormecerá nuestro entendimiento hasta el grado de cometer toda una serie de tropelías pecaminosas e inconfesables. 

Fuente de la imagen: morguefile

Sin embargo, la botella que contiene el néctar tiene en su boca uno de esos tubos metálicos que dosifican las dosis y que controlan el flujo de líquido, por lo que el proceso de llenar el vaso, acercarlo a los labios y pegarse el lingotazo se nos antoja demasiado largo; la decisión es evidente: necesitamos dos vasos, de forma que podamos llenar uno mientras nos bebemos otro, para así poder acelerar el trámite de la melopea. Bien, pues el vaso que se está llenando es un buffer. No me digáis que la explicación no es mucho más divertida que la de la Wiki... Siguiendo con la metáfora, si tuviésemos dos vasos llenándose al mismo tiempo tendríamos un doble buffer, y si fuesen tres, un triple buffer. Cuantos más vasos, más información lista para ser utilizada, y más rápido será el proceso. 
Salvando las distancias, y extrapolando la metáfora al mundo de la informática (mucho más aburrido que el ambiente de la tasca fronteriza, para qué vamos a engañarnos), determinados procesos necesitan de esta clase de "búferes" (discupad la castellanización del término) para poder establecer una comunicación fluida entre unos elementos y otros del sistema. Uno de los ejemplos más claros es en el de la transmisión de imágenes desde la tarjeta gráfica hasta la misma pantalla. Este proceso es extremadamente exigente y requiere de este tipo de estrategias de intermediación con el fin de proporcionar fluidez al resultado final: la visualización de "cosas en movimiento" en nuestras pantallas. 

El tearing y el V-sync

Al elenco de esta historia tenemos que añadir dos nuevos actores: el tearing y el V-sync. Como ya comenté en el último capítulo dedicado a Cinelerra, nuestros monitores tienen una tasa de refresco que se puede comparar con los fotogramas de las películas cinematográficas tradicionales. Dependiendo de cada monitor, una imagen en movimiento constará de 50, 60, 75, 100 o 200 cuadros fijos por segundo (o incluso más). Ahora bien, nuestras tarjetas gráficas tienen también su tasa de frames (fps), cuya cantidad depende principalmente de dos factores: la propia construcción de los componentes de la tarjeta (limitaciones de hardware  o de los controladores software) y el nivel de complejidad de los dibujos que tenga que hacer (más complejo para renderizado de elementos 3d, como en muchos videojuegos, más simple en 2d, como en las películas). De este modo, la tasa de frames de nuestra gráfica puede fluir libremente y no se adapta necesariamente a  la tasa de frames de nuestra pantalla. Generalmente esto no debería dar problemas, pues en principio, cuantos más fps sea capaz de dibujar nuestra gráfica, mejor. Esto es especialmente importante para los videojuegos modernos, donde hay una relación directamente proporcional entre la tasa de frames y la sensación de inmersión y fluidez en el juego. Sin embargo, en otras ocasiones nos puede dar problemas: en determinados casos, si la tasa de frames de nuestra gráfica y de nuestro monitor no están sincronizados, pueden aparecer molestos efectos. Aquí entra el primer personaje: el tearing o "lagrimeo". Como explico en el vídeo, el tearing consiste en una ruptura del cuadro, es decir, la aparición de una línea horizontal (generalmente en la parte superior de la pantalla) que "rompe" la imagen en dos. El efecto suele estar relacionado con movimientos horizontales, bien de elementos de nuestro escritorio, o muy habitualmente en escenas de travelling durante el visionado de películas. Y para solucionar este molesto problema tenemos el V-sync, que suele ser una opción disponible en los programas de configuración de nuestros controladores de vídeo y en la configuración de Compiz (de la que hablaré al final del artículo). Resumiendo mucho, lo que hace el V-Sync (o "sincronización vertical") es armonizar la tasa de frames de nuestra tarjeta con la del monitor, forzando a la primera a limitar el dibujado de cuadros por segundo a la cantidad nativa del segundo. Activando esta opción puede disminuir o desaparecer completamente el tearing. Sin embargo, a veces no es suficiente con esto, pues nos podemos encontrar con limitaciones del primer tipo que indicaba antes (en gráficas poco potentes sobre todo), por lo que nuestro hardware no llega a dibujar los cuadros por segundo que es capaz de reproducir el monitor. Si estamos en este caso, el tearing será visible aun activando la sincronización vertical. 
Si enlazamos esta explicación con la metáfora de los vasos de tequila, podríamos decir que la sincronización vertical es un camarero amable que llena los vasos a una velocidad adecuada, para que no nos atragantemos. Si ve que nos cuesta beber a partir de, pongamos, cuarenta lingotazos, va llenando más despacio, de forma que nosotros percibamos que el camarero siempre llena el siguiente chupito justo en el momento en que apuramos las últimas gotas del vaso. Y si por un casual aceleramos el ritmo, el camarero también lo hará, aunque ajustando la velocidad para que no nos volvamos atragantar.  
Y aquí es donde entra en juego el triple buffer, que hace el mismo trabajo que el de los vasos extra de la metáfora introductoria. El triple buffer almacenará la información que emite la gráfica y la dosificará cuando sea conveniente, de forma que, a efectos de visualización, el comportamiento gráfico sea el correcto. En realidad es una forma de "trampear" el procesamiento gráfico de nuestras máquinas, proporcionando pasos intermedios que harán que nuestro ordenador pueda "tomarse un tiempo" para calcular con perfección los elementos que aparecerán en pantalla. 
Visto así, parece que es una buena idea contar con las opciones de la sincronización vertical y el triple buffer como apoyo, en aras a una visión suave y sin cortes de nuestras imágenes. Pero no es tan sencillo, hay que tener en cuenta una serie de cosas, que describo en el siguiente epígrafe.

La encrucijada del triple buffer y el V-sync

En relación con los posibles problemas que acarrea la utilización de estos dos elementos se han vertido ríos de píxeles en foros especializados. Os invito a hacer una búsqueda en San Google para que os hagáis una idea. El caso es que parece estar aceptada la idea de que la sincronización vertical está genial para ver películas pero no es tan buena idea para los juegos. Este razonamiento se basa en la idea de que los juegos exigen un enorme esfuerzo de procesado, por lo que no resulta buena idea "limitar" la cantidad de frames por segundo. En cuanto al triple buffer, ya indico en el vídeo que el problema en este caso es el de la latencia. Volvamos a la metáfora: Después de un rato de repetir la mecánica de llenado de chupito - empinamiento de codo, es turno de dar por finiquitado el contenido de la botella. Llegado este momento, observamos que ante nosotros, sobre la polvorienta y pegajosa barra del bar, se encuentran los dos últimos vasos de tequila que nuestro solícito camarero (quien a estas alturas ya es como de la familia para nosotros) se ha encargado de rellenar. La botella, por su parte, ha vertido ya sus últimas gotas; y sin embargo, nos queda todavía un poquito por beber. Así que, aunque la botella no tenga líquido, nos queda todavía un tiempo para dar nuestra misión por terminada. Este desfase es la latencia. Generalmente este problema de latencia puede pasar desapercibido, habida cuenta de que en realidad es una cuestión de unos cuantos milisegundos (me estoy refiriendo a la latencia de vídeo, sólo conozco un par de personas capaces de beberse chupitos en milisegundos). La latencia, por lo tanto, no interfiere con el trabajo diario en nuestro ordenador y no tiene influencia al ver películas. Sin embargo, sí que podremos notarla en videojuegos, sobre todo en aquellos que exijan una gran velocidad y precisión (los shooters, sobre todo). Una pequeña diferencia entre la presión de un botón y la acción con la que se asocia puede ser la diferencia entre un certero tiro en el cráneo o una vergonzosa muerte a manos de un enemigo. 
La decisión, en este sentido, queda en nuestra mano, y las combinaciones son múltiples:
  • Jugones: si el V-sync da problemas, lo desactivamos. El triple buffer, en principio, desterrado. A costa de posible tearing, eso sí.
  • No jugones que sufren de tearing (y les molesta):  Triple buffer y Vsync si queremos efectos de vídeo suaves y nos gusta ver pelis en el PC. 
  • Usuario tipo "No sé de qué me estás hablando, yo estoy contentísimo con mi configuración de vídeo y no tengo ni V-sync ni Triple buffer ni nada de eso": Me alegro por ti, aunque lamento que hayas perdido el tiempo leyendo todo el tocho.

Activar el Triple Buffer y V-Sync en Ubuntu

Como siempre que hablo de cosas relacionadas con las tarjetas de vídeo, lamento no poder ofrecer información sobre el procedimiento de activación de estas opciones en tarjetas ATI. De todas formas, sospecho que el proceso será o muy parecido, o el mismo. 
Para activar el triple buffer hacemos lo que os enseño en el vídeo. Editamos el archivo xorg.conf:
sudo gedit /etc/X11/xorg.conf
En la ventana de gedit resultante de aplicar este comando debemos buscar la sección "devices" y añadir la siguiente opción:

Option "TripleBuffer" "true"

Si por un casual no tenemos la sección "devices", no hay problema, la creamos:
Section "Device"
Identifier "Device0"
Driver "nvidia"
Option "TripleBuffer" "true"
EndSection
Guardamos el archivo, y listo; si volvemos a iniciar sesión tendremos ya activado el triple buffer. Para rematar, podemos también activar las opciones de sincronización vertical en la configuración de nuestro entorno de escritorio. El encargado de esto en Ubuntu es, como sabréis, Compiz. Sin embargo, las últimas distribuciones de Ubuntu no nos facilitan demasiado la alteración del comportamiento de este gestor de ventanas. Por eso, tendremos que instalar el siguiente programa:
sudo apt-get install compizconfig-settings-manager
A partir de este momento, dispondréis del programa "Administración de composiciones de Compiz", que podremos encontrar más fácilmente en el Dash si escribimos los "motes" con los que se le conoce: CCSM o simplemente Compiz. 
Lo que sí os recomiendo encarecidamente es que si no tenéis experiencia con Compiz mejor no toquéis nada. Las opciones que nos da este programa tocan las intimidades más secretas del compositor de ventanas, así que si hacemos algo mal podemos meternos en un lío. Un lío que, como siempre, tiene solución, pero que es un rollo, así que cuidadito o al menos esperad a que haga el tuto correspondiente. 
En lo que nos concierne, las opciones importantes están en dos apartados del programa, Composite y OpenGL,  cuya configuración recomendada para los fines que perseguimos podréis ver en las siguientes imágenes:

En composite, activamos las casillas marcadas con flechas


En OpenGL, seleccionamos el filtro señalado con una flecha y marcamos las casillas recuadradas
Por último, con el paso del tiempo he ido probando unas cuantas combinaciones de configuración de vídeo, y he encontrado algunas que me dan buenos resultados, y que quiero compartir con vosotros. En los controladores privativos de las tarjetas Nvidia, podemos marcar las siguientes opciones en la sección "OpenGL Settings":

Marcamos las mismas casillas que en la imagen y seleccionamos High Quality

Conclusión 

Ya veis que los entresijos de la informática son incluso más complejos de lo que los profanos podamos imaginar. No he llegado a encontrar un consenso firme en relación con este tema de la sincronización vertical, el tearing, etc. Hay quien sostiene que la V-Sync y el Triple buffer no son adecuados para jugones, y hay quien sostiene que no influyen en el rendimiento jugón en absoluto. En lo que a mi experiencia concierne, siempre he activado ambas opciones porque ya os digo que mi uso del PC habitual (además de para producir estos vídeo-artículos) es el del visionado de películas, y el tearing me molesta mucho. Pero de vez en cuando también le doy a los videojuegos, y lo único que me ha llegado a dar problemas es la sincronización vertical (que en juegos muy exigentes puede provocar fuertes bajadas en la tasa de fotogramas por segundo, y por lo tanto el juego parece ir más lento o a tirones). En cuanto a la supuesta latencia, no he experimentado nada parecido. Pero mi experiencia en este campo no es suficiente, porque no lo he comprobado en Shooters, que es donde por lo visto el problema se hace patente. Por suerte, el proceso de desactivación de estas opciones  es tan sencillo como el de su activación (borramos la línea de xorg.conf y desactivamos las casillas de Compiz y del controlador de Nvidia), por lo que podréis experimentar libremente la combinación que os vaya mejor a cada uno.
Quiero remarcar que muchas de las opciones que propongo son fruto de mi propia experiencia, así que agradeceré que aportéis la vuestra; si conocéis más maneras de mejorar el rendimiento gráfico o de eliminar artefactos como el tearing y que sean alternativas a las que propongo, son más que bienvenidas.