despegue

1. ¿Qué es una textura?

Cualquier objeto virtual en un entorno tridimensional, como sucede en los simuladores de vuelo, está compuesto de dos partes: una malla y una textura con la que se "pinta" esa malla.

Ejemplo de malla:

Ejemplo de una textura aplicada a una malla:

Imágenes de cgtrader.com

2. Resolución de las texturas

La resolución de una textura es, simplemente, el número de píxeles (o puntos de color) que vamos a usar para "pintarla". Si usamos un número de píxeles bajo para una determinada superficie veremos la textura "borrosa" y falta de detalles; especialmente si hacemos zoom para ampliar. Esa textura "pobre", en cambio, puede que se vea correctamente si la miramos a una cierta distancia. Por lo tanto, un factor importantísimo en nuestra percepción de la nitidez de una textura es a qué distancia vamos a verla.

Pongamos un ejemplo clásico: las texturas del terreno mientras volamos. Si vamos a hacer un vuelo VFR a baja altura disfrutaremos mucho más del terreno si tenemos texturas de alta resolución. Sin embargo, si solemos hacer vuelos comerciales a más de 30.000 pies, podemos ser perfectamente felices usando texturas del suelo de baja resolución.

Siguiendo con ese razonamiento, si usamos texturas de baja resolución para "pintar" el interior de la cabina de una avión tendremos una mala experiencia porque siempre estaremos a una corta distancia de todos los instrumentos y, si la resolución es baja, se verán muy borrosos.

Aunque la siguiente imagen no está relacionada con la simulación, muestra perfectamente la influencia de distintas resoluciones de texturas en el aspecto visual final de un objeto en 3D. Los números de cada imagen representan su resolución, en las resoluciones de píxeles más habituales a día de hoy.

MUY IMPORTANTE: Pincha en la imagen para ampliarla y poder analizar las diferencias

Imagen por cdna.artstation.com

3. ¿Más es siempre mejor?

Definitivamente, NO.

Si analizas detenidamente la imagen anterior, verás un importante salto en la calidad de la texturas cuando pasamos de 256 píxeles a 512. La mejora en la calidad cuando pasamos de 512 a 1014 es notable, pero no tan evidente. En la zona rugosa se aprecian mejor las diferencias pero, en la zona metálica lisa, no hay ganancia alguna.

A partir de 1024 píxeles es imposible apreciar ganancia de calidad a simple vista.

En el mundo de la simulación de vuelo sucede algo muy similar. Las texturas de 1024 píxeles ofrecen una importante mejora visual con respecto a texturas de resolución inferior, pero texturas superiores no suelen aportar mucho.

4. Los problemas de usar texturas de alta resolución

Cada vez que se genera una textura el sistema debe almacenarla tanto en la memoria de la tarjeta gráfica como la memoria del sistema. Aunque las texturas se aplican a objetos 3D, las texturas en sí misma son siempre planas. Cuando decimos que usamos texturas de 256 píxeles lo que queremos decir, en realidad, es que usamos cuadrados de texturas de 256 x 256 píxeles. Hagamos cuentas...

256 x 256 = 65.536 píxeles por textura

512 x 512 = 262.144 píxeles por textura

1024 x 1024 = 1.048.576 píxeles por textura

2048 x 2048 = 4.194.304 píxeles por textura

4096 x 4096 = 16.777.216 píxeles por textura

Las texturas de 512 píxeles contienen 4 veces más resolución que las 256, las de 1024 contienen 4 veces más que las de 512 y así sucesivamente. Eso quiere decir que cada vez que hacemos un "salto" de resolución, pasando de 512 a 1024, por ejemplo, vamos a necesitar 4 veces más memoria que antes y la carga de nuestro procesador también aumentará al tener que procesar todos esos píxeles adicionales. Y, como el aumento es exponencial, el consumo se DISPARA con las resoluciones más altas. Por ejemplo, una textura de 2048 píxeles tiene SESENTA Y CUATRO (64) veces más resolución que una textura de 256 píxeles.

Las texturas de alta resolución ponen "de rodillas" hasta al ordenador más potente en la actualidad haciendo que la fluidez del simualdor, los famosos FPS (imágenes por segundo), caiga en picado. Pero aún en el caso de que tengas un equipo potente, hay otro problema peor: el consumo de memoria.

Hasta la llegada de P3Dv4, todos los simuladores anteriores eran de 32 bits. Eso quiere decir que, independientemente de la cantidad de memoria instalada en el equipo, un simualador de vuelo de 32 bits (FSX, FSX:SE, P3D v1, v2 y v3) solo puede usar un máximo de 4GB de memoria; independientemente de cuánta memoria tenga instalada el equipo. Y, cuando el simulador usa los 4 GB de memoria que tiene disponibles... ¡BANG! La aplicación se cuelga por un error OOM (Out of Memory, o falta de memoria) Hay que cerrar el vuelo a medias y volver a empezar.

P3Dv4, al ser un simulador de 64 bits no sufre ese problema. Pero eso no quiere decir que no existan límites. Seguiremos teniendo como límite la cantidad de memoria física tanto del equipo como la de la tarjeta gráfica.

5. Aspectos a tener en cuenta para optimizar el uso de memoria en tu simulador

5.1.Texturas repetidas vs texturas diferentes 

Por defecto, tanto FSX como P3D usan unas "pocas" texturas diferentes que se repiten sin cesar aquí y allá. Aunque una textura se repita, solo se carga y se procesa una vez. Así que "repetir" es bueno tanto desde el punto de vista del rendimiento como del consumo de memoria. Pero, a menudo, el resultado es "pobre" visualmente y no es raro que podamos ver claramente recuadros con la misma textura que se repiten sin cesar; especialmente en zonas de poco detalle como en grandes extensiones de agua o desierto.

La alternativa son las texturas fotorrealistas, que muestran el terreno tal y como es en realidad. ¡CUIDADO! En las texturas fotorrealistas NO HAY REPETICIÓN así que todas y cada una de las parcelas del terreno son diferentes. Eso quiere decir que el consumo de memoria es EXPONENCIALMENTE MAYOR que con respecto a las texturas por defecto, lo que hace MUY PROBABLE que tengas errores OOM si combinas esas texturas con aviones detallados que, por su parte, también hacen un alto consumo de memoria.

Por ese motivo, las texturas fotorrealistas suelen tener una resolución MUY interior al resto de texturas y siempre se ven borrosas cuando se vuelan a baja altura. Al desarrollador no le queda otro remedio: usar texturas de alta resolución para escenarios fotorrealistas extensos es una garantía de errores OOM.

Algunos desarrolladores han logrado alcanzar un término medio que, en muchos casos, resulta tremendamente satisfactorio. Es el caso de ORBX FTX Global, Gound Environment X o Ultimate Terrain X. Estos productos ofrecen una variedad de texturas mayor que las que FSX o P3D ofrecen por defecto, logrando un buen aspecto visual, y suelen estar muy optimizadas para lograr el menor consumo de memoria posible.

5.2. Los formatos BMP, DTX1, DTX3 y DTX5

En el mundo de la imagen digital, el color de cada píxel se representa mediante una combinación de 3 colores: rojo, verde y azul o, en inglés, Red, Green, Blue.

En la actualidad, todas las pantallas del mercado doméstico, como monitores, televisores, pantallas de móviles, etc, pueden mostrar una combinación de 256 tonos diferentes para cada uno de esos valores (el rojo, el verde y el azul). 256 son 28 (dos elevado a 8), de ahí que a ese formato se le llame de 8 bits.

Representación visual de las distintas profundidades de color, en bits:

Fuente: the-working-man.org

En el mundo virtual de la simulación de vuelo, además de los colores, a menudo hay que tener en cuenta otro factor: la transparencia, a la que se le conoce comúnmente como canal Alpha. Al formato que combina estos tres colores, más la transparencia, se llama, por sus siglas en inglés, RGBA (Red, Green, Blue, Alpha)

Para saber cuánto ocupa una textura en la memoria, o en el disco duro, tenemos que calcular, PARA CADA PÍXEL:

8 bit por canal x 4 canales (los 3 colores + la transparencia) = 32 bits, siendo 1 bit la cantidad mínima de información que se puede procesar.

Para convertir a bytes, tenemos que dividir por 8:

32 / 8 = 4 bytes

Es decir, PARA CADA PÍXEL, necesitamos 4 bytes de memoria. Ahora hagamos cuentas para cada BLOQUE de texturas:

256 x 256 = 65.536 x 4 = 262.144 bytes / 1.024 = 256 KB

512 x 512 = 262.144 x 4 = 1.048.576 bytes / 1.024 = 1.024 KB / 1.024 = 1 MB

1024 x 1024 = 1.048.576 x 4 = 4.194.304 bytes / 1.024 = 4.096 KB / 1.024 = 4 MB

2048 x 2048 = 4.194.304 x 4 = 16.777.216 bytes / 1.024 = 16.384 KB / 1.024 = 16 MB

4096 x 4096 = 16.777.216 x 4 = 67.108.864 bytes / 1.024 = 65.536 KB / 1.024 = 64 MB

En entornos virtuales tan extensos y complejos como el de la simulación se utilizan cientos o miles de texturas que llenan la memoria mucho más rápido de lo que todos, tanto desarrolladores como usuarios, deseamos. Así que pronto se vio la necesidad de utilizar alguna técnica que permitiera reducir el tamaño que las texturas ocupan en memoria. Aunque hay varios formatos de compresión, en el mundo de la simulación de vuelo, el más usado es uno llamado S3 Texture Compression (S3TC). Aunque, en realidad, casi nadie se referiere a ese formato con ese nombre, sino como DTX. Las variantes usadas en la simulación de vuelo, que luego veremos, son las DTX1, DTX3 y DTX5.

Si abres la carpeta de texturas de cualquier escenario o avión, puedes encontrarte dos tipos de archivo:

BMP: A los archivos BMP contienen texturas en formato RGBA y se le conoce como RAW o "crudo" porque las texturas se almacenan en su formato original. La parte buena: preservan el 100% de la calidad visual original. La parte mala: son auténticas DEVORADORAS de memoria.

DDS: Los archivos DDS contienen texturas en cualquiera de las variantes del formato DTX. La parte buena: las texturas DTX1 logran un ratio de compresión de 6:1. Es decir, ocupan en memoria 6 veces menos que las originales en formato BMP. En el caso de las texturas en formato DTX3 y DTX5 la ratio es de 4:1. La parte mala: esa reducción se logra aplicándole al color una compresión con pérdida de información con respecto a la textura original. Es decir, una textura BMP siempre se verá mejor. Sin embargo, la pérdida de calidad queda de sobra comprensada, no solo con la reducción del uso de memoria por parte de las texturas, sino también con la ganancia de rendimiento.

Ejemplo visual de la pérdida de la precisión de color tras aplicar una compresión DTX:

Fuente: fsdeveloper.com

Siempre que puedas, elige texturas DTX. Si el escenario o avión que quieres usar no están en formato DTX (archivos .DDS) siempre puedes convertir los BMP a DDS tú mismo con diversas herramientas:

https://www.avsim.com/forums/topic/413917-dds-mass-texture-converter/

http://www.mwgfx.co.uk/programs/dxtbmp.htm

https://vvvv.org/contribution/dds-converter

Ten en cuenta, eso sí, que la reducción en el uso de la memoria y aumento en el rendimiento es directamente proporcional al uso que haga el simulador de esas texturas. Los beneficios de convertir texturas RGBA a DTX serán mucho más notables si conviertes un extenso escenario fotorrealista que si conviertes la textura exterior de un avión.

A la hora de elegir qué formato DTX usar (DTX1, DTX3 o DTX5) hay que tener en cuenta que como ya sabemos, cada color básico (RGB) tiene 256 variaciones. Eso son 28 (dos elevado a 8) u 8 bits. Sin embargo, a menudo una textura no necesita transparencia. ¿Por qué "derrochar" memoria almacenando información que no necesitamos? El formato DTX1 es perfecto para texturas sólidas porque, en lugar de 256 niveles de transparencia (8 bit) solo incluye dos: o la textura es totalmente transparante o es totalmente opaca.

Los formatos DTX3 y DTX5 logran la misma reducción en el tamaño de las texturas. Su diferencia radica en la forma en la que se procesa la capa de transparencia. Las texturas DTX3 asignan solo 4 bits a las transparencias, usando los otros 8 bits para el color. Este formato funciona muy bien cuando no es necesario un degradado drtallado de las transparencias. Las texturas en formato DTX5 ofrecen transparencias más precisas a cambio de sacrificar algo más la precisión del color.

5.3 Distancia (LOD_RADIUS) y consumo de memoria 

A menudo, cuando usamos la vista exterior del avión el suelo se ve "estupendamente". Luego hacemos zoom para ampliar y ver los detalles y... ¡horror! ¡Está todo borroso!

El simulador tiene un ajuste que define el radio, alrededor del avión, en el que se cargarán las texturas a la máxima resolución. Más allá de esa distancia las texturas se cargan a resolución reducida para minimizar el consumo de memoria. Hace años que se usa una técnica llamada "mipmaps" que consiste en almacenar en un único archivo la misma textura con distintas resoluciones.

Imagen por Wikipedia.

Como decía, más allá de la distancia definida, las texturas a cargar serán las incluidas en el archivo mipmaps de calidad reducida que, como he comentado se ven borrosas al ampliar. Y aquí llega lo complicado. Todos queremos que las texturas se vean nítidas hasta el infinito. Pero, como creo que ya ha quedado claro a estas alturas, ampliar el radio de dibujo, conocido como LOD_RADIUS por cómo se llama esta variable en el archivo de configuración, implica cargar más texturas (además de otros objetos 3D) a resolución completa y, a su vez, disparar el consumo de memoria (además de una mayor carga para el procesador, claro). Aumentar el LOD_RADIUSs siempre ha sido una causa habitual de errores OOM en las versiones de 32 bits (FSX, FSX:SE y P3Dv1, P3Dv2 y P3Dv3) En el caso de P3Dv4 el margen es mucho mayor pero sigue existiendo y, además, siempre penalizará el rendimiento (FPS o imágenes por segundo).

5.4 Sobre el ajuste TEXTURE_MAX_LOAD en el archivo de configuración

Por defecto, la resolución máxima de las texturas en FSX y P3D es de 1024 píxeles. Ese ajuste queda definido en la variable TEXTURE_MAX_LOAD del archivo de configuración.

Ahora bien, ¿qué pasa cuando usamos escenarios o aviones con texturas de 2048 o a 4096 píxeles? Pues depende... Veamos por qué.

Las texturas de la mayoría de escenarios y aviones incluyen MIPMAPS que, como hemos visto en el apartado anterior, son varias versiones de distinta resolución de una misma textura. Sin embargo, en ocasiones el desarrollador solo ofrece una versión con texturas de alta resolución.

SIEMPRE Y CUANDO las texturas incluyan MIPMAPS, lo cual, insisto, es optativo, el simulador limitará la resolución de las texturas a cargar al valor indicado en el apartado TEXTURE_MAX_LOAD que, como sabemos, es de 1024 por defecto. Sin embargo, si el desarrollador solo incluye texturas de alta resolución, por ejemplo de 2048, entonces ese parámetro no tiene efecto alguno porque el simulador no tiene "dónde elegir". Solo tiene la texturas en una resolución y, por tanto, esas son las únicas que puede mostrar

6. Consejos finales

6.1 Las texturas con una resolución superior a 1024 píxeles no suelen ser rentables para el exterior. Para la cabina virtual, posiblemente, la mejor opción sean las texturas de 2048 píxeles.

6.2 Siempre que puedas, elige o genera texturas DTX almacenadas en formato DDS, y evita las RBGA almacenadas en formato BMP.

6.3 Aumentar la resolución de las texturas y el radio de dibujo darán como resultado texturas más nítidas a cualquier distancia. Sin embargo, aumentar estos valores, además de provocar una caída de rendimiento, aumentan exponencialmente las probabilidades de provocar un error de falta de memoria (Out Of Memory, o OOM) en las versiones de 32 bits (FSX, FSX:SE, P3Dv1, P3Dv2 y P3Dv3). En P3Dv4 también puede haber errores OOM en los casos más extremos cuando se usa toda la memoria física de la tarjeta gráfica o del equipo y, en cualquier caso, siempre provocan caída de rendimiento.

 

6.4 Nunca actives más escenarios fotorrealistas de lo que necesites. Especialmente en FSX pueden provocar errores OOM aún en los casos en los que vueles a miles de kilómetros de distancia de esos escenarios.