Optimizando una compilación para reducir el tamaño

Fundamentos

A veces, se desea optimizar una compilación para reducir el tamaño en lugar de la velocidad. Esto significa no compilar funciones no utilizadas del motor, así como utilizar banderas específicas del compilador para ayudar a disminuir el tamaño de la compilación. Situaciones comunes incluyen crear compilaciones para plataformas móviles y Web.

Este tutorial tiene como objetivo proporcionar una visión general de diferentes métodos para crear un archivo binario más pequeño. Antes de continuar, se recomienda leer los tutoriales anteriores sobre cómo compilar Godot para cada plataforma.

Las opciones a continuación se enumeran desde la más importante (mayor ahorro de tamaño) hasta la menos importante (menor ahorro de tamaño).

Eliminación de símbolos de binarios

  • Ahorro de espacio: Muy alto

  • Dificultad: Fácil

  • Realizado en compilaciones oficiales:

Si compilas binarios para Windows (MinGW), Linux o macOS desde el código fuente, recuerda eliminar los símbolos de depuración de los binarios instalando el paquete strip desde tu distribución y luego ejecutando:

strip path/to/godot.binary

En Windows, strip.exe está incluido en la mayoría de las configuraciones del conjunto de herramientas MinGW.

Esto reducirá el tamaño de los binarios compilados en un factor entre 5× y 10×. La desventaja es que las trazas de fallos ya no proporcionarán información precisa (lo que es útil para solucionar problemas de un fallo). Los profilers de C++ tampoco podrán mostrar los nombres de las funciones (esto no afecta al profiler integrado de GDScript).

Nota

El comando anterior no funcionará en los binarios de Windows compilados con MSVC, ni en plataformas como Android y HTML5. En su lugar, pasa la opción debug_symbols=no en la línea de comandos de SCons al compilar.

Optimizando para tamaño en lugar de velocidad

  • Ahorro de espacio: Alto

  • Dificultad: Fácil

  • Realizado en compilaciones oficiales: Sí, pero solo para HTML5

A partir de Godot 3.1 en adelante, es posible compilar utilizando optimizaciones de tamaño (en lugar de velocidad). Para habilitar esto, establece la bandera optimize en size:

scons p=windows target=release tools=no optimize=size

Algunas plataformas, como WebAssembly, ya utilizan este modo de forma predeterminada.

Desabilitando 3D

  • Ahorro de espacio: Moderado

  • Dificultad: Fácil

  • Realizado en compilaciones oficiales: No

Para juegos 2D, tener todo el motor 3D disponible generalmente no tiene sentido. Por esta razón, existe una opción de compilación para desactivarlo:

scons p=windows target=release tools=no disable_3d=yes

Las herramientas deben estar deshabilitadas para usar esta opción, ya que el editor no está diseñado para funcionar sin soporte 3D. Sin él, el tamaño del binario puede reducirse aproximadamente en un 15%.

Deshabilitar objetos de la GUI avanzados

  • Ahorro de espacio: Moderado

  • Dificultad: Fácil

  • Realizado en compilaciones oficiales: No

La mayoría de los juegos pequeños no requieren controles de GUI complejos como Tree, ItemList, TextEdit o GraphEdit. Pueden deshabilitarse usando una opción de compilación:

scons p=windows target=release tools=no disable_advanced_gui=yes

Esto es todo lo que será deshabilitado:

  • FileDialog

  • PopupMenu

  • Árbol

  • TextEdit

  • TreeItem

  • OptionButton

  • SpinBox

  • ColorPicker

  • ColorPickerButton

  • RichTextLabel

  • RichTextEffect

  • CharFXTransform

  • PopupDialog

  • WindowDialog

  • AcceptDialog

  • ConfirmationDialog

  • MarginContainer

  • ViewportContainer

  • SplitContainer

  • HSplitContainer

  • GraphNode

  • GraphEdit

Desactivando módulos no deseados

  • Ahorro de espacio: Muy bajo a moderado según los módulos

  • Dificultad: Media a alta según los módulos

  • Realizado en compilaciones oficiales: No

Muchas de las funciones de Godot se ofrecen como módulos. Puedes ver una lista de los módulos con el siguiente comando:

scons --help

La lista de módulos que pueden ser desactivados aparecerá junto con todas las opciones de compilación. Si estás trabajando en un juego simple en 2D, podrías desactivar muchos de ellos:

scons p=windows target=release tools=no module_arkit_enabled=no module_assimp_enabled=no module_bmp_enabled=no module_bullet_enabled=no module_camera_enabled=no module_csg_enabled=no module_dds_enabled=no module_enet_enabled=no module_etc_enabled=no module_gdnative_enabled=no module_gridmap_enabled=no module_hdr_enabled=no module_jsonrpc_enabled=no module_mbedtls_enabled=no module_mobile_vr_enabled=no module_opensimplex_enabled=no module_opus_enabled=no module_pvr_enabled=no module_recast_enabled=no module_regex_enabled=no module_squish_enabled=no module_svg_enabled=no module_tga_enabled=no module_theora_enabled=no module_tinyexr_enabled=no module_upnp_enabled=no module_vhacd_enabled=no module_vorbis_enabled=no module_webm_enabled=no module_webrtc_enabled=no module_websocket_enabled=no module_xatlas_unwrap_enabled=no

Si esto no funciona para tu caso de uso, deberías revisar la lista de módulos y ver cuáles aún necesitas realmente para tu juego (por ejemplo, es posible que desees conservar los módulos relacionados con la red, el soporte de expresiones regulares o theora/webm para reproducir videos).

Como alternativa, puedes proporcionar una lista de módulos desactivados creando un archivo llamado custom.py en la raíz del código fuente, con un contenido similar al siguiente:

# custom.py

module_arkit_enabled = "no"
module_assimp_enabled = "no"
module_bmp_enabled = "no"
module_bullet_enabled = "no"
module_camera_enabled = "no"
module_csg_enabled = "no"
module_dds_enabled = "no"
module_enet_enabled = "no"
module_etc_enabled = "no"
module_gdnative_enabled = "no"
module_gridmap_enabled = "no"
module_hdr_enabled = "no"
module_jsonrpc_enabled = "no"
module_mbedtls_enabled = "no"
module_mobile_vr_enabled = "no"
module_opensimplex_enabled = "no"
module_opus_enabled = "no"
module_pvr_enabled = "no"
module_recast_enabled = "no"
module_regex_enabled = "no"
module_squish_enabled = "no"
module_svg_enabled = "no"
module_tga_enabled = "no"
module_theora_enabled = "no"
module_tinyexr_enabled = "no"
module_upnp_enabled = "no"
module_vhacd_enabled = "no"
module_vorbis_enabled = "no"
module_webm_enabled = "no"
module_webrtc_enabled = "no"
module_websocket_enabled = "no"
module_xatlas_unwrap_enabled = "no"