Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

为尺寸优化构建

依据

有时, 需要针对大小而不是速度来优化构建. 这意味着不编译引擎上的未使用的函数, 以及使用特定的编译器标志来帮助减小构建大小. 常见情况包括为移动和Web平台创建构建.

本教程旨在概述创建较小二进制文件的不同方法. 在继续之前, 建议阅读之前有关为每个平台编译Godot的教程.

下面的选项按照从最重要(大小节省得最多)到最不重要(大小节省得最少)的顺序排列。

剥离二进制文件

  • 节省空间:非常高

  • 难度:简单

  • 在官方构建中执行:

如果你从源码构建了 Windows(MinGW)、Linux、macOS 的二进制文件,请记得剥离二进制文件中的调试符号。首先请安装你的发行版中的 strip 包,然后执行:

strip path/to/godot.binary

在 Windows 上,大多数 MinGW 工具链安装时都会包含 strip.exe

这样可以将编译后二进制文件减少到原先五分之一到十分之一的大小。缺点是崩溃追踪中就无法再提供准确的信息了(可用于查找崩溃原因)。C++ 性能分析器也将无法显示函数名称(不影响内置的 GDScript 性能分析器)。

备注

上面的命令对于使用 MSVC(微软的 Visual Studio 编译器)编译的 Windows 程序,以及 Android 和 Web 等平台是行不通的。在这些情况下,你应该在编译时的 SCons 命令行中直接加上 debug_symbols=no 这个参数。

针对大小而不是速度优化

  • 节省空间:

  • 难度:简单

  • 在官方构建中执行:是,但仅限于 Web 构建

完全可以通过针对体积的优化来编译 Godot(而不是针对速度)。想要开启这个功能,只需要把 optimize 参数设置为 size 就可以了:

scons target=template_release optimize=size

某些平台如WebAssembly默认情况下已使用此模式.

Godot 4.5 新增了 size_extra 选项,可进一步减小构建体积。

scons target=template_release optimize=size_extra

从当前项目中检测已使用的功能,并禁用未使用的功能

  • 节省空间: 中等到较高,具体取决于你的项目情况

  • 难度: 简单到中等,具体取决于项目

  • 在官方构建中执行:

Godot 提供了一个 使用引擎编译配置编辑器 工具,可检测当前项目中使用到的功能并生成构建配置文件。保存后,该配置文件可在编译自定义导出模板时传递给 SCons:

scons target=template_release build_profile=/path/to/profile.gdbuild

请注意,对于某些项目,功能检测可能会过于激进,导致禁用实际运行时所需的功能。这种情况可能发生在某些功能的使用方式无法通过静态分析检测到时(例如脚本在运行时被程序化地创建并执行)。

可通过以下章节禁用更具体的功能,但请注意,其中许多功能会被引擎编译配置检测器自动识别并处理。

禁用高级文本服务器

  • 节省空间:

  • 难度:简单

  • 在官方构建中执行:

默认情况下,Godot使用一个支持以下功能的高级文本服务器:

  • 书写阿拉伯语和希伯来语等语言所需的从右向左的排版和复杂的文字。

  • 字体连字和 OpenType 功能(例如小型大写字母、分数和斜线零)。

Godot 其实提供了一个备用的文本服务器,不过它默认是不会被编译进去的。这个文本服务器可以作为一个轻量级的替代品,来取代默认的高级文本服务器:

scons target=template_release module_text_server_adv_enabled=no module_text_server_fb_enabled=yes

如果你的项目只打算支持基于拉丁字母、希腊字母和西里尔字母的语言,那么使用备用文本服务器就完全足够了。

这个备用的文本服务器(Fallback text server)处理大量文本的速度,甚至比高级文本服务器还要快。这也让它非常适合用在移动端或者网页端的项目里。

备注

请记得在使用 module_text_server_adv_enabled=no 的同时传入 module_text_server_fb_enabled=yes。否则编译后的二进制文件中不会包含任何文本服务器,导致运行项目时不显示任何文本。

禁用 3D

  • 节省空间:一般

  • 难度:简单

  • 在官方构建中执行:

对于 2D 游戏,拥有整个 3D 引擎通常没有任何意义。因此,有一个构建标志来禁用它:

scons target=template_release disable_3d=yes

必须禁用工具才能使用此标志, 因为编辑器不能在没有3D支持的情况下运行. 没有它, 二进制大小可以减少大约15%.

禁用高级 GUI 对象

  • 节省空间:一般

  • 难度:简单

  • 在官方构建中执行:

大多数小游戏不需要复杂的GUI控件, 如Tree, ItemList, TextEdit或GraphEdit. 它们可以用一个构建标志来禁用:

scons target=template_release disable_advanced_gui=yes

以下所有东西都会被禁用:

禁用物理引擎

  • 节省的空间: 低到中等

  • 难度:简单

  • 在官方构建中执行:

如果你的 3D 项目使用的是 Jolt Physics,那你就可以在编译时把 Godot 自带的物理引擎(GodotPhysics3D)给禁用了,因为既然你用了 Jolt,自带的这个引擎就永远不会被用到。

scons target=template_release module_godot_physics_3d_enabled=no

反过来说,如果你的 3D 项目用的是 Godot 自带的物理引擎(GodotPhysics3D),那你也可以在编译时把 Jolt Physics 物理引擎给禁用了。

scons target=template_release module_jolt_enabled=no

如果你的项目只涉及 3D 渲染而不需要物理碰撞(或者只需要 2D 渲染而不需要物理碰撞),那你完全可以彻底禁用掉 2D 或 3D 物理引擎。大多数 3D 项目其实都能从中受益,因为很多纯 3D 的游戏根本就用不到 2D 物理引擎。

scons target=template_release disable_physics_2d=yes
scons target=template_release disable_physics_3d=yes

禁用不需要的模块

  • 节省空间:非常低到一般之间,取决于模块

  • 难度:中等到难之间,取决于模块

  • 在官方构建中执行:

许多Godot的功能都作为模块提供. 你可以使用以下命令查看模块列表:

scons --help

将显示可以禁用的模块列表以及所有构建选项. 如果你正在开发简单的2D游戏, 则可以禁用其中的许多功能:

scons target=template_release module_astcenc_enabled=no module_basis_universal_enabled=no module_bcdec_enabled=no module_bmp_enabled=no module_camera_enabled=no module_csg_enabled=no module_dds_enabled=no module_enet_enabled=no module_etcpak_enabled=no module_fbx_enabled=no module_gltf_enabled=no module_gridmap_enabled=no module_hdr_enabled=no module_interactive_music_enabled=no module_jsonrpc_enabled=no module_ktx_enabled=no module_mbedtls_enabled=no module_meshoptimizer_enabled=no module_mp3_enabled=no module_mobile_vr_enabled=no module_msdfgen_enabled=no module_multiplayer_enabled=no module_noise_enabled=no module_navigation_2d_enabled=no module_navigation_3d_enabled=no module_ogg_enabled=no module_openxr_enabled=no module_raycast_enabled=no module_regex_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_webrtc_enabled=no module_websocket_enabled=no module_webxr_enabled=no module_zip_enabled=no

如果这(指精简模块)对你的使用场景来说行不通,你应该重新检查一下模块列表,看看你的游戏到底还需要哪些模块(比如,你可能还是想保留网络相关的模块、正则表达式支持,用来播放音乐的 mp3/ogg/vorbis ,或者用来播放视频的 theora )。

或者, 你也可以通过在源代码的根部创建 custom.py 来提供一个禁用模块的列表, 其内容类似于以下:

custom.py
module_astcenc_enabled = "no"
module_basis_universal_enabled = "no"
module_bcdec_enabled = "no"
module_bmp_enabled = "no"
module_camera_enabled = "no"
module_csg_enabled = "no"
module_dds_enabled = "no"
module_enet_enabled = "no"
module_etcpak_enabled = "no"
module_fbx_enabled = "no"
module_gltf_enabled = "no"
module_gridmap_enabled = "no"
module_hdr_enabled = "no"
module_interactive_music_enabled = "no"
module_jsonrpc_enabled = "no"
module_ktx_enabled = "no"
module_mbedtls_enabled = "no"
module_meshoptimizer_enabled = "no"
module_mp3_enabled = "no"
module_mobile_vr_enabled = "no"
module_msdfgen_enabled = "no"
module_multiplayer_enabled = "no"
module_noise_enabled = "no"
module_navigation_2d_enabled = "no"
module_navigation_3d_enabled = "no"
module_ogg_enabled = "no"
module_openxr_enabled = "no"
module_raycast_enabled = "no"
module_regex_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_webrtc_enabled = "no"
module_websocket_enabled = "no"
module_webxr_enabled = "no"
module_zip_enabled = "no"

优化项目的分发

桌面

备注

本节内容仅适用于在桌面平台上分发文件,且该平台本身没有进行额外压缩或打包处理的情况。因此,当你通过 itch.io 或 GitHub Releases 发布 ZIP 压缩包时,这些建议就非常适用了。

像 Steam 这样的平台已经应用了它们自己的压缩方案,所以你不需要首先创建一个 ZIP 存档来分发文件。

顺便提一句,你也可以研究一下如何优化你自己项目的分发(打包)。而且,这完全不需要你重新编译导出模板就能做到。

你可以使用 7-Zip 来创建比普通压缩方式效率更高的 ZIP 压缩包,同时它还完全兼容所有的 ZIP 解压工具(包括 Windows 系统自带的解压功能)。对于大型项目来说,相比普通的 ZIP 压缩工具,这样打包出来的文件体积最多能减少几十兆(MB),虽然通常情况下平均能节省 1 到 5 MB 左右。虽然创建这种高压缩率的 ZIP 包会比平时多花一点时间,但解压速度和其他普通 ZIP 包是一样快的。

当使用 7-Zip GUI 时,这是通过使用超压缩模式创建 Zip 存档来完成的。使用命令行时,使用以下命令完成此操作:

7z a -mx9 my_project.zip folder_containing_executable_and_pck

Web

为网页导出中的所有文件类型(尤其是 .wasm.pck 文件)启用 gzip 或 Brotli 压缩,可以显著减小下载体积,从而大幅加快加载速度,尤其是在网速较慢的情况下效果非常明显。

创建具有高压缩级别的预压缩 gzip 或 Brotli 文件可能会更有效,只要 web 服务器被配置为在这些文件存在时提供服务。如果支持的话,Brotli 应该比 gzip 更受欢迎,因为它在减小文件大小方面有更大的潜力。

详细步骤见 提供文件