Rendimiento

Optimización FiveM: arregla el texture loss y los assets pesados

Cómo optimizar tu servidor FiveM: encuentra los assets que causan texture loss, reduce texturas con DXT1/DXT5 y mipmaps, y saca los autos del warning rojo.

· 11 min de lectura

La mayoría de los servidores FiveM que sufren texture loss, "city bug", entradas lentas y crasheos del cliente no tienen un problema de scripts. Tienen un problema de assets: unos cuantos autos, packs de ropa o mapas mucho más pesados que cualquier cosa que trae Rockstar, todos peleando por la misma memoria de streaming en la PC de cada jugador. Esta guía te muestra de dónde sale ese peso, cómo encontrarlo y cómo reducirlo para optimizar tu servidor FiveM sin que se vea peor.

Versión corta: revisa la consola del servidor buscando los warnings "Asset ... uses X MiB of physical memory", ordena tus carpetas stream/ por tamaño y arregla primero los peores. La mayor parte del ahorro sale de las texturas: baja las resoluciones exageradas, usa compresión DXT1/DXT5, mantén los mipmaps y deja de mandar las mismas texturas dos veces.

Por qué importa el tamaño de los assets en stream

Todo lo que está en la carpeta stream/ de un resource te cuesta dos veces.

  1. Descarga al entrar. Los jugadores descargan cada archivo en stream antes de poder jugar. FiveM guarda los archivos en caché local, así que quien vuelve solo descarga lo que cambió, pero los jugadores nuevos y cualquiera después de una actualización grande pagan el precio completo. Un servidor con varios gigabytes de contenido en stream pierde gente en la pantalla de carga.
  2. Memoria de streaming del cliente. GTA V carga y descarga modelos y texturas de la memoria a medida que el jugador se mueve, con un presupuesto pensado para los assets de Rockstar. Cuando las texturas de un solo auto ocupan la memoria de una docena de autos normales, el juego saca otra cosa para hacerles lugar, normalmente las calles y los edificios alrededor del jugador. Eso es el texture loss.

El tamaño del archivo en disco es solo una pista. Los archivos en stream están comprimidos, así que un .ytd que parece modesto puede ocupar muchísimo más en memoria. FiveM te dice el tamaño en memoria, y ese es el número que importa.

El warning de "oversized assets"

Cuando un resource arranca, FXServer lee el tamaño en memoria guardado en el header de cada archivo en stream y muestra un warning para todo lo que sea grande. El mensaje se ve así:

Asset my_car/my_car.ytd uses 87.4 MiB of physical memory. Oversized assets can and WILL lead to streaming issues (such as models not loading/rendering).

Los límites salen directo del código fuente de FXServer (ResourceStreamComponent.cpp):

Tamaño en memoriaQué muestra la consola
16 MiB o menosNada
Más de 16 MiBWarning en azul
Más de 32 MiBWarning en amarillo
Más de 48 MiBSe agrega la frase "Oversized assets can and WILL lead to streaming issues"
Más de 64 MiBWarning en rojo

El chequeo se hace por separado para memoria physical (sobre todo datos de texturas, lo que termina en la GPU) y memoria virtual (los datos del lado de la CPU, como la estructura del modelo y la geometría). Un .ytd grande casi siempre dispara el warning de physical; un .yft o .ydr muy denso puede disparar el de virtual.

El resource igual carga, pero la recomendación del staff de Cfx.re es apuntar a más o menos lo que usa un asset equivalente de Rockstar. Trata cada línea roja como un bug y cada línea amarilla como una tarea pendiente.

Texturas: donde está la mayor parte del peso

Las texturas viven dentro de diccionarios de texturas .ytd (o embebidas en los modelos, más sobre eso abajo). La memoria que usa una textura depende de tres cosas: resolución, formato y si tiene mipmaps o no.

Memoria por textura (DXT5 con mipmaps)

Resolución

La memoria escala con la cantidad de píxeles, así que reducir el ancho y el alto a la mitad divide el costo por cuatro. Esto es lo que cuesta una sola textura en tamaños comunes:

ResoluciónSin comprimir (A8R8G8B8)DXT5DXT1
4096 × 409664 MiB16 MiB8 MiB
2048 × 204816 MiB4 MiB2 MiB
1024 × 10244 MiB1 MiB0.5 MiB
512 × 5121 MiB0.25 MiB0.125 MiB

Súmale más o menos un tercio a cada valor por la cadena completa de mipmaps. Una sola textura 4K sin comprimir alcanza para disparar el warning rojo por sí sola, y los packs de autos muchas veces traen varias.

Formatos de compresión

GTA V usa formatos DDS con compresión por bloques, también llamados formatos BC:

  • DXT1 (BC1): sin alpha o con alpha de 1 bit. La opción más barata. Úsalo para la mayoría de las texturas diffuse sin transparencia.
  • DXT5 (BC3): canal alpha completo al doble del costo de DXT1. Úsalo cuando la textura necesita transparencia suave, como vidrios, decals o pelo.
  • Sin comprimir (A8R8G8B8): cuatro veces el costo de DXT5. Solo se justifica en texturas muy chicas donde los artefactos de compresión se notan, como algunos elementos de UI.

Exportar todo sin comprimir o en DXT5 "por las dudas" es un error común. Pasar las texturas sin transparencia a DXT1 suele ser la mayor ganancia individual en un pack de autos.

Mipmaps

Los mipmaps son copias reducidas de una textura que el juego usa para los objetos lejanos. Cuestan alrededor de un tercio más de memoria, pero sacarlos es un falso ahorro: los objetos lejanos empiezan a parpadear y siguen usando la textura en tamaño completo. Mantén los mipmaps y ahorra memoria bajando la resolución.

Tamaños en potencia de dos

Usa dimensiones en potencia de dos: 256, 512, 1024, 2048. No tienen que ser cuadradas (1024 × 512 está bien). La compresión por bloques trabaja con bloques de 4 × 4 píxeles y cada nivel de mip reduce el tamaño a la mitad, así que tamaños raros como 1000 × 750 se comprimen mal y generan mips inferiores feos.

Qué texturas puedes reducir sin miedo

No todas las texturas necesitan el mismo detalle. Un orden práctico para atacarlas:

  • Se pueden bajar mucho: texturas del interior y de la parte de abajo, motor, cálipers de freno, emblemas chicos, todo lo que la cámara casi nunca ve de cerca.
  • Normalmente se pueden reducir a la mitad: normal maps y specular maps. Los jugadores notan un color borroso mucho antes que un normal map más suave.
  • Mantén más alta: la textura principal de la carrocería o la livery de un vehículo, las caras y las texturas de ropa más visibles.

Ojo con las liveries: cada una es su propia textura, así que diez liveries 4K cuestan diez veces más aunque solo se vea una a la vez.

Modelos: polígonos, LODs y texturas embebidas

Los modelos se cargan en stream como .ydr (drawables), .ydd (drawable dictionaries, usados para ropa) y .yft (fragments, usados para vehículos y objetos rompibles). Si no conoces estos nombres de archivo, mira formatos de archivo de GTA V y FiveM.

  • Cantidad de polígonos. Los modelos hechos para renders o para otros juegos muchas veces traen mucha más geometría de la que GTA V necesita, lo que infla la memoria virtual y el frame time.
  • LODs. GTA V cambia a versiones más simples de un modelo según la distancia. Un modelo con un solo nivel de alto detalle renderiza la malla completa en todos lados.
  • Texturas embebidas vs compartidas. Un modelo puede embeber sus texturas o referenciar un .ytd aparte. Si diez props embeben la misma textura de madera, pagas diez veces. Pon las texturas compartidas en un solo .ytd.

Cuando haces tus propios props, estas decisiones se toman al exportar. Props personalizados en FiveM explica cómo se arma un resource de props.

Vehículos: el culpable de siempre

Los vehículos son la fuente más común de warnings rojos, por varias razones:

  • Modelos porteados. Los autos convertidos de otros juegos muchas veces traen decenas de texturas 4K y mallas extremadamente densas.
  • Los archivos _hi. Un vehículo de GTA V se divide en name.yft y name_hi.yft, más name.ytd y muchas veces name+hi.ytd. Los archivos _hi y +hi tienen el modelo y las texturas de alto detalle que se usan de cerca; los archivos normales deberían ser más livianos. Muchas conversiones ponen contenido en detalle completo en ambos, así que el auto se carga prácticamente dos veces.

Para cada auto marcado, ordena las texturas del .ytd por tamaño y arregla primero las más grandes. DXT1 para las texturas sin alpha y 512 o 1024 para las texturas de interior y de detalle normalmente saca a un auto del rojo.

Packs de ropa

Los packs de ropa son muchos archivos .ydd y .ytd chicos. Los archivos individuales casi nunca disparan warnings; el problema es el volumen. Cada drawable y cada variación de textura suma a la descarga, y los packs grandes llevan el tamaño total en stream a varios gigabytes.

  • Saca los drawables que nadie usa. Outfits de eventos viejos y variaciones duplicadas se van sumando.
  • Mantén las texturas de ropa en tamaños razonables. Una camiseta no necesita una textura 4K.
  • Controla la cantidad de drawables por slot de componente. GTA V tiene un límite por slot, y los packs que lo superan hacen que la ropa aparezca mal o directamente no aparezca.

Packs de ropa para FiveM explica cómo se estructuran e instalan los packs.

Mapas y MLOs

Los mapas y los interiores MLO combinan todo lo anterior, más los archivos de ubicación (.ymap, .ytyp). Revisa:

  • Diccionarios de texturas. Los mappers muchas veces mandan un solo .ytd gigante para todo un interior. Dividirlo o reducirlo ayuda, porque el diccionario entero se carga cuando cualquier objeto lo necesita.
  • Colisión. La colisión (.ybn) debería ser más simple que la malla visual. Una malla de colisión copiada de la malla de render es cara y puede hacer que la física falle.
  • Mapas superpuestos. Dos mapas que modifican la misma zona causan parpadeos u objetos que faltan. Quédate con uno.

Para saber más sobre cómo se arman y cargan los interiores, mira MLOs en FiveM.

Auditar tu servidor

No necesitas optimizar todo. Encuentra el peor 10% y arregla eso.

1. Lee la consola

Cada warning al iniciar indica el resource y el archivo. Júntalos y ordénalos por tamaño.

2. Ordena las carpetas stream por tamaño

En Linux o macOS, esto lista los 30 archivos en stream más grandes de todos los resources:

find resources -path '*/stream/*' -type f -exec du -k {} + | sort -rn | head -30

En Windows, PowerShell hace lo mismo:

Get-ChildItem resources -Recurse -File |
  Where-Object { $_.FullName -match '\\stream\\' } |
  Sort-Object Length -Descending |
  Select-Object -First 30 FullName, @{n='MB';e={[math]::Round($_.Length/1MB,1)}}

Recuerda que el tamaño en disco está comprimido; úsalo para encontrar candidatos y los warnings de la consola para confirmar.

3. Encuentra duplicados

Los servidores grandes acumulan duplicados: dos resources haciendo stream del mismo auto, un MLO viejo al lado de su versión nueva. Con nombres de archivo repetidos, una versión pisa a la otra, pero los jugadores igual descargan las dos. Busca nombres de archivo repetidos en resources/ y quédate con una sola copia.

4. Saca lo que no usas

Los resources que no tienen ensure no se mandan a los jugadores, pero ensucian las auditorías. Borra los packs que no usas, incluidos los autos que nadie maneja.

Herramientas

HerramientaPara qué sirve
OpenIVAbrir archivos .ytd, .ydr y .yft, ver tamaños y formatos de texturas, y exportar o reemplazar texturas.
CodeWalkerExplorar mapas y datos de ubicación, previsualizar modelos y texturas, y editar archivos .ymap/.ytyp.
SollumzAdd-on gratis de Blender para importar y exportar modelos de GTA V, incluidos LODs y colisión.
Editores de imagen con soporte DDSPaint.NET (soporte DDS integrado), GIMP, o Photoshop con el Texture Tools Exporter de NVIDIA, para redimensionar y recomprimir texturas.

Arreglo típico: exporta las texturas más grandes del .ytd con OpenIV, redimensiónalas y recomprímelas con mipmaps, y después vuelve a importarlas.

Los scripts también importan, en resumen

Los scripts igual pueden causar tirones. Aprieta F8 y ejecuta resmon 1 para ver el tiempo de CPU del cliente por resource; un script en reposo debería estar cerca de 0.00 ms. El culpable típico es un loop while true do Wait(0) que corre en cada frame cuando solo importa cerca de una ubicación. Usa waits más largos, chequeos de distancia y eventos. La guía para crear un servidor tiene un checklist corto de rendimiento para el resto del stack.

Si estás creando props nuevos en vez de arreglar los viejos, el generador 3D de BLDR crea props listos para el juego a partir de un prompt, una imagen o un GLB y los exporta como un resource de FiveM con archivos .ydr, .ytd y .ytyp, así puedes revisar el tamaño de sus texturas antes de que lleguen a tu carpeta stream/.

Preguntas frecuentes

¿Qué tamaño debería tener un asset de FiveM?

FXServer empieza a mostrar warnings cuando un archivo en stream usa más de 16 MiB de memoria physical o virtual, así que 16 MiB es el objetivo práctico. Muchos vehículos y props pueden ser bastante más chicos. Todo lo que pase de 48 MiB recibe el warning explícito de "oversized assets" y debería arreglarse primero.

¿El warning de oversized assets significa que el resource está roto?

No. El resource igual carga y puede verse bien en un servidor de pruebas vacío. El warning significa que el asset ocupa una parte desproporcionada de la memoria de streaming, lo que se nota como texture loss y modelos que no cargan cuando hay muchos jugadores y assets en la misma zona.

¿Reducir el tamaño de las texturas va a hacer que mis autos se vean peor?

No de forma notable si lo haces en el orden correcto. Las texturas del interior, de la parte de abajo y de detalle se pueden bajar mucho sin diferencia visible en el juego normal. Mantén la carrocería y las liveries en una resolución razonable, usa DXT1 donde no hay transparencia y deja los mipmaps activados.

¿Por qué los jugadores siguen teniendo texture loss después de arreglar los warnings?

El texture loss depende de todo lo que está cargado alrededor del jugador. Muchos assets medianos en un mismo lugar, como un car meet al lado de un MLO detallado, igual pueden agotar la memoria de streaming. Sigue reduciendo el tamaño total en stream en los lugares donde se juntan los jugadores.

Sigue leyendo