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: Sí
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.
Compilando con optimización en tiempo de enlace¶
Ahorro de espacio: Alto
Dificultad: Fácil
Realizado en compilaciones oficiales: Sí
Habilitar la optimización en tiempo de enlace produce binarios más eficientes, tanto en términos de rendimiento como de tamaño de archivo. Funciona eliminando funciones de plantilla duplicadas y código no utilizado. Actualmente, se puede utilizar con los compiladores GCC y MSVC:
scons p=windows target=release tools=no use_lto=yes
El enlazado se vuelve mucho más lento y consume más memoria RAM con esta opción, por lo que se debe utilizar solo para compilaciones de lanzamiento:
Cuando se compila la rama
master
, se necesita al menos 8 GB de RAM disponibles para enlazar correctamente con LTO habilitado.Cuando se compila la rama
3.x
, se necesita al menos 6 GB de RAM disponibles para enlazar correctamente con LTO habilitado.
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"
Ver también