25 de noviembre, 2013
Artículo indiespensable
Indiespensable
Dev Lavde #13 — La televisión (Segunda Parte)

Queremos tanto a la tele que, incluso después de la evolución tecnológica sufrida en las últimas décadas, la mayoría de los salones de las familias occidentales se siguen configurando alrededor de ella, pasando del Feng Shui y de los artículos de la revista Hogar. Y eso que la tele sólo serviría para ver Guerra de subastas y Gandía Shore, si no fuera por el ecosistema de aparatos que fluyen a su alrededor. ¿Merece la pena un SmartTV si ya no está Alf para alegrarnos el día? No tengo respuesta a eso, pero puedo intentar arrojar luz sobre cómo funciona el «monitor de la Play», como diría alguno. Hablaré también de resoluciones y del multibuffering, un palabro que se usa para tratar con el espinoso screen tearing.

El tamaño y el aspecto grotesco han dado paso a la delgadez y la elegancia, las líneas han dado paso a los píxeles, y lo analógico dio finalmente el salto a lo digital (costó lo suyo, eso sí). Ahora hay teles que incluso se controlan por voz y gestos. Y a muy buen precio. Todo eso ha sido gracias a los avances en los semiconductores y la electrónica integrada. Veamos cómo funciona una tele moderna.

El presente

Como os podéis imaginar, actualmente, los monitores o televisiones digitales funcionan de forma bastante distinta. Gracias al avance en la ingeniería de materiales, se han podido sustituir los rayos catódicos por distintas tecnologías, basadas la mayoría de ellas en semiconductores.

Primero llegaron las pantallas TFT-LCD (Thin Film Transistor, Liquid Crystal Display), que se basan en la misma tecnología que las pantallas de las calculadoras, salvo que en este caso se utiliza un filtro de color y un transistor para controlar la activación de cada píxel. A pesar de su menor consumo y las ventajas en tamaño, la tecnología de cristal líquido no emite luz, por lo que requieren de un panel de iluminación trasera o retro-iluminación. En las primeras pantallas TFT, se utilizaban tubos fluorescentes para la retro-iluminación, resultando en pantallas un poco más gruesas y que se calentaban notablemente. Hoy en día, las pantallas TFT han mejorado bastante su tecnología, y en lugar de tubos fluorescentes se utiliza un panel de diodos LED (normalmente de color blanco) para la iluminación trasera, por lo que han reducido aún más su tamaño, consumo y temperatura, además de haber mejorado su contraste y brillo.

Poco después de las TFT llegaron las pantallas de plasma, que utilizan unas micro-celdas con gas, en funcionamiento muy similares a los tubos fluorescentes. En este caso cada celda es emisora de luz, por lo que la imagen puede obtener un mayor contraste y brillo. En su detrimento está el que, en un principio, debido al mayor tamaño de las celdas, sólo se podían usar para pantallas grandes de alrededor de 50 pulgadas en adelante, además de ser más caras de producir.

Las pantallas de los dispositivos móviles, tan de moda estos días, en cambio, tienden a utilizar la relativamente nueva gama de diodos orgánicos emisores de luz denominados OLED (Organic Light Emitting Diode). Su principal ventaja frente a las TFT es su bajo consumo, su tamaño, flexibilidad y mayor brillo y contraste, ya que en este caso sí emiten luz directamente. Como desventajas están su tiempo de vida más corto y un proceso de fabricación más caro y de mayor impacto medioambiental.

Resoluciones

Si antes hablábamos de líneas (en el estándar PAL eran 576), ahora tenemos píxeles. Actualmente, lo que se muestra en pantalla es como una fotografía digital: hay un ancho y un alto que nos da la resolución de esa imagen. En estos momentos, la next-gen consolera está intentando con todo su poder de cálculo Intel x86 que los juegos funcionen a resolución FullHD: 1920 píxels de ancho, por 1080 de alto. Y se encuentra con algunas dificultades, debo añadir. Algunos se preguntarán, recordando que los fabricantes de televisiones comienzan a mostrar sus aparatos con resolución 4K (4096×2160) ¿por qué cuesta tanto mejorar el tamaño? La realidad es que aumentar la resolución no es algo tan sencillo como parece ni para el cine ni para los juegos.

En el cine, una mejor resolución conlleva mejores cámaras (en esto no estoy muy puesto, e imagino que ya existen cámaras digitales con esa resolución), pero sobretodo implica un problema en el almacenamiento. Para almacenar un fotograma a resolución FullHD, tenemos 1920×1080 píxeles, o sea 2.073.600 píxeles, lo que viene a ser, aproximadamente (a 8 bits por color) 6,22 MBytes sin compresión. Por tanto, hay que almacenar 150 MBytes por segundo de metraje, ya que el cine suele tener una tasa de 24 fotogramas/segundo. A resolución 4K, en cambio, tenemos 8.847.360 píxeles por fotograma, lo que nos da, siguiendo los mismos cálculos, 26,54 MB por fotograma o 637 MBytes por segundo. Os podéis hacer una idea de lo que ocupa una película en 4K sin compresión. De hecho, una película de 90 minutos implicaría más de 3 TeraBytes (1 TeraByte equivale a 1024 GigaBytes).

Eso significa que, aun con mucha compresión, una película a 4K no cabe en un blu-ray (que soportan a día de hoy un máximo de 50 GigaBytes). Por ahí se habla ya de nuevos discos capaces de soportar más de 1 TeraByte, pero aún no han llegado a los hogares. Evidentemente, esa resolución complica también el streaming a través de Internet, sólo el más avanzado estándar de red local (que está muy lejos de la ADSL casera) permitiría esa velocidad.

En videojuegos no implica problemas de almacenamiento ya que la imagen se genera al vuelo y no hay que guardarla, pero ¿os acordáis aquello que conté sobre que había que hacer un montón de cálculos por cada píxel? Pues podéis echar mano a la calculadora también para ver cuántos píxeles hay de diferencia entre 1280×720 y 1920×1080, no digamos ya 4K. Y sí, la next-gen tiene una capacidad de proceso enorme comparada con la current-gen, pero también se ha complicado mucho el renderizado y hay que hacer muchos más cálculos: más polígonos, efectos más complejos, partículas, fluidos, telas, colisiones más realistas… y recordemos que a los juegos les pedimos 60 fotogramas por segundo, faltaría más.

Total, que es posible que pudiéramos poner Quake (id Software, 1996) a resolución 4K, pero no me extraña que algunos juegos actuales tengan que recurrir al famoso «reescalado», que seguro también habéis leído por ahí. El cálculo necesario para ampliar una imagen ya renderizada, es mucho mas sencillo que los cálculos que se necesitan para obtener el color de todos los píxeles de más que conlleva una mayor resolución. Al final hay que elegir entre resolución y efectos, y la verdad, yo me quedaría con lo último.

Sé que alguno se está rascando la cabeza ahora mismo, preguntándose qué pasa con los fotogramas por segundo y por qué en juegos se necesitan 60 y no 24 como en el cine. Prometo que intentaré (y pongo énfasis en la palabra intentaré) responder a estas cuestiones en el siguiente artículo, pero aparquemos la curiosidad por el momento.

Sincronismo vertical y multibuffering

La tecnología digital es muy distinta, pero todavía se mantienen algunos conceptos. Por ejemplo, se sigue teniendo que transmitir la información mediante un cable o modulada en ondas electromagnéticas, por lo que se sigue usando una señal parecida, también con los intervalos de sincronía, eso sí, digitalizada. Para más información, el proceso de digitalización de una señal está comentado con un poco más de detalle en el Dev Lavde #10, en el que hablaba sobre la digitalización del sonido. Los principios son básicamente los mismos para la digitalización de cualquier señal analógica. Aunque, en realidad, ya casi nunca hace falta digitalizar la señal, ya que tanto las tarjetas gráficas como las pantallas están preparadas para funcionar directamente con señales digitales, sin tener que convertir de analógico a digital o viceversa. Gracias a esto nos hemos podido olvidar del terrible euro-conector (no he visto cable más puñetero) para estandarizar el cable HDMI, muchísimo más práctico.

Así que aún en digital ocurre lo mismo: si se cambia la imagen durante la transmisión de la señal de video, al igual que pasaba con la señal analógica puede producirse scren tearing.

Toda la maquinaria del videojuego se centra en renderizar y componer una imagen (del tamaño adecuado) para colocarla en una zona de memoria llamada Frame Buffer o Front Buffer, que se transmite al monitor o tele a través del hardware de la GPU. Si se toca el contenido del Frame Buffer fuera de los intervalos de sincronía, es cuando se corre el riesgo de que se produzca screen tearing. Para evitarlo, se puede utilizar un buffer alternativo, el Back Buffer, que se usará para componer la imagen mientras se mantiene fijo el contenido del Frame Buffer. Cuando llega el refresco vertical, se copia el contenido de este Back Buffer al Frame Buffer, de forma que el nuevo fotograma quede fijo sin problemas hasta el siguiente intervalo de sincronía.

A esta técnica se le llama Double Buffering y tiene varias pegas. La primera es que hay que mantener en memoria dos buffers de pantalla, en los que se suelen ir varios MegaBytes de memoria de vídeo (que en algunos casos puede suponer un problema). También el copiar todos los datos de un buffer a otro suele llevar tiempo de proceso. Pero sobretodo tiene un problema cuando no todo funciona como es debido. Como ya imaginaréis, no cuesta lo mismo componer unas imágenes u otras, depende del número de objetos que haya en la pantalla, efectos, luces, etc. Por lo que el tiempo requerido para renderizar la imagen es bastante variable durante la ejecución del juego. Eso significa que puede ocurrir que algún fotograma tarde más en componerse de lo que dura el intervalo entre los impulsos de sincronía vertical. Si esto ocurre, no se podrá copiar el contenido del Back Buffer, ya que no está completo, y habrá que esperar hasta la siguiente sincronía. Eso hace que se pase de estar actualizando la pantalla a la frecuencia del monitor, a cualquier otra frecuencia n veces menor, es decir, la mitad, un tercio… dependiendo de lo que se tarde en renderizar cada pantalla. Y no sólo eso, también hay cierto retraso o latencia desde que se renderiza la imagen hasta que se muestra, que puede llegar a ser de un fotograma de duración, lo que a bajas velocidades de refresco puede ser notable y desembocar en cierto input-lag, no siendo inmediata la respuesta a las acciones del jugador.

En la imagen se puede observar este problema: la gráfica superior muestra un sistema en el que el tiempo de renderizado de los fotogramas en el Back Buffer (cada rectángulo de color) es menor que el intervalo de refresco de la pantalla (marcado con las rayas verticales). En la gráfica inferior ocurre lo contario, el tiempo de renderizado es superior al intervalo de refresco, por lo que se repiten fotogramas en el Frame Buffer.

Para solucionar este problema se utiliza una técnica llamada Triple Buffering. En este caso, se utilizan dos Back Buffers, lo que permite ir componiendo un nuevo fotograma mientras uno de los buffers está bloqueado a la espera de copiar su contenido al Frame Buffer. Los buffers se irán copiando en el Frame Buffer alternativamente cuando llegue la sincronía vertical. Esto mejora notablemente el comportamiento cuando el tiempo de renderizado es inferior al intervalo entre sincronías. Sólo habrá que repetir fotograma en algunos momentos puntuales. Sin embargo, tiene varias desventajas: Se utiliza un Buffer más, por lo que se necesita una mayor cantidad de memoria, y, además puede ocurrir que se desperdicien fotogramas ya compuestos. Pero sobretodo, sigue sin arreglar el problema de la latencia que se observaba en el Double Buffering.

Igualmente, en la imagen se describe el funcionamiento del Triple Buffering cuando la velocidad de composición de los fotogramas es mayor que la frecuencia de actualización de la pantalla (arriba) y cuando es menor (abajo). Se puede ver en la gráfica superior cómo el fotograma 3 es descartado, debido a que el fotograma 4 ya está listo cuando llega la sincronía vertical. Cuando el renderizado es más lento, se repite algún fotograma, pero, en este caso, sólo ocurre con uno de cada tres.

En resumen

En el artículo anterior, ya adelantaba el problema resultante de cambiar el fotograma que se está transmitiendo a la pantalla, y que se podía solucionar esperando al refresco vertical. Sin embargo, el esperar al refresco vertical tiene sus implicaciones. Aunque el Triple Buffering es una buena solución, no es perfecta: consume memoria y añade latencia. Por lo que la mayoría de juegos permiten escoger entre activarlo o no.

También hemos comprobado que una mayor resolución implica mayor tiempo de renderizado, lo que significa menor tasa de fotogramas por segundo. Dada la complicación de los cálculos que tiene que hacer un videojuego para componer cada imagen, las máquinas se ven forzadas al límite para lograr una tasa de fotogramas estable y suficientemente rápida. Habitualmente se presume que a partir de 60 imágenes por segundo no se observa ningún salto entre fotogramas, pero el valor numérico de esta tasa es algo que someteré a discusión en el siguiente artículo. Total, que con tanto lío no es de extrañar que Carmack se esté tirando de los pelos para arreglar todos los problemas de latencia en el Oculus Rift.

DEV LAVDE #12 – LA TELEVISIÓN (PRIMERA PARTE)

Acerca de Enrique Hervás


Humano Nivel 32. Diseñador y Programador de videojuegos Nivel 6. De esos a los que sus padres prohibieron jugar a "las maquinitas" por estar demasiado enganchados. No sabían lo que les esperaba. Actualmente trabajo como Game Designer en Exient, e intento no olvidarme de mi pasado indie de Game Jams y jueguitos con Join2 Games

No hay comentarios