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.

크기에 따른 빌드 최적화

이론적 근거

때로는 속도보다는 크기에 맞춰 빌드를 최적화해야 하는 경우도 있습니다. 즉, 엔진에서 사용되지 않는 함수를 컴파일하지 않고 특정 컴파일러 플래그를 사용하여 빌드 크기를 줄이는 데 도움을 줍니다. 일반적인 상황에는 모바일 및 웹 플랫폼용 빌드 생성이 포함됩니다.

이 튜토리얼의 목적은 더 작은 바이너리를 생성하는 다양한 방법에 대한 개요를 제공하는 것입니다. 계속하기 전에, 각 플랫폼에 대한 Godot 컴파일에 대한 이전 튜토리얼을 읽는 것이 좋습니다.

아래 옵션은 가장 중요한 것(최대 크기 절감)부터 가장 중요하지 않은 것(최소 크기 절감)까지 나열되어 있습니다.

스트리핑 바이너리

  • 공간 절약: 매우 높음

  • 난이도: 쉬움

  • 공식 빌드에서 수행됨:

소스에서 Windows(MinGW), Linux 또는 macOS 바이너리를 빌드하는 경우 배포판에서 strip 패키지를 설치한 후 다음을 실행하여 바이너리에서 디버그 기호를 제거해야 합니다.

strip path/to/godot.binary

Windows에서는 대부분의 MinGW 도구 체인 설정에 ``strip.exe``가 포함되어 있습니다.

이렇게 하면 컴파일된 바이너리의 크기가 5배에서 10배 사이로 줄어듭니다. 단점은 충돌 역추적이 더 이상 정확한 정보를 제공하지 않는다는 것입니다(충돌 원인을 해결하는 데 유용함). C++ 프로파일러 또한 더 이상 함수 이름을 표시할 수 없습니다(이는 내장된 GDScript 프로파일러에 영향을 미치지 않습니다).

참고

위 명령은 MSVC로 컴파일된 Windows 바이너리와 Android 및 웹과 같은 플랫폼에서는 작동하지 않습니다. 대신, 컴파일할 때 SCons 명령줄에서 ``debug_symbols=no``를 전달하세요.

속도 대신 크기 최적화

  • 공간 절약: 높음

  • 난이도: 쉬움

  • 공식 빌드에서 수행됨: 예, 하지만 웹 빌드에만 해당됩니다.

(속도 대신) 크기 최적화를 사용하여 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 기능(예: 작은 대문자, 분수 및 슬래시 0)

Godot는 기본적으로 컴파일되지 않는 대체 텍스트 서버를 제공합니다. 이 텍스트 서버는 기본 고급 텍스트 서버에 대한 간단한 대안으로 사용할 수 있습니다.

scons target=template_release module_text_server_adv_enabled=no module_text_server_fb_enabled=yes

프로젝트에서 라틴어, 그리스어 및 키릴어 기반 언어만 지원하려는 경우 대체 텍스트 서버로 충분합니다.

이 대체 텍스트 서버는 고급 텍스트 서버보다 더 빠르게 대량의 텍스트를 처리할 수도 있습니다. 이는 대체 텍스트 서버를 모바일/웹 프로젝트에 적합하게 만듭니다.

참고

``module_text_server_adv_enabled=no``를 사용할 때는 항상 ``module_text_server_fb_enabled=yes``를 전달해야 합니다. Otherwise, the compiled binary won't contain any text server, which means no text will be displayed at all when running the project.

3D 비활성화

  • 공간 절약: 보통

  • 난이도: 쉬움

  • 공식 빌드에서 수행됨: 아니요

2D 게임의 경우 전체 3D 엔진을 사용하는 것은 일반적으로 의미가 없습니다. 이 때문에 이를 비활성화하는 빌드 플래그가 있습니다.

scons target=template_release disable_3d=yes

편집기는 3D 지원 없이 작동하도록 설계되지 않았기 때문에 이 플래그를 사용하려면 도구를 비활성화해야 합니다. 그렇지 않으면 바이너리 크기가 약 15% 정도 줄어들 수 있습니다.

특정 오브젝트를 비활성화하기

  • 공간 절약: 보통

  • 난이도: 쉬움

  • 공식 빌드에서 수행됨: 아니요

대부분의 소규모 게임에는 Tree, ItemList, TextEdit 또는 GraphEdit와 같은 복잡한 GUI 컨트롤이 필요하지 않습니다. 빌드 플래그를 사용하여 비활성화할 수 있습니다:

scons target=template_release disable_advanced_gui=yes

비활성화되는 모든 항목은 다음과 같습니다.

물리적 본 만들기

  • 공간 절약: 낮음~보통

  • 난이도: 쉬움

  • 공식 빌드에서 수행됨: 아니요

3D 프로젝트에서 Jolt Physics를 사용하는 경우 GodotPhysics3D는 절대 사용되지 않으므로 컴파일 타임에 비활성화할 수 있습니다.

scons target=template_release module_godot_physics_3d_enabled=no

반대로, 3D 프로젝트가 GodotPhysics3D를 사용하는 경우 컴파일 타임에 Jolt Physics를 비활성화할 수 있습니다.

scons target=template_release module_jolt_enabled=no

프로젝트에서 3D 렌더링을 사용하지만 물리는 사용하지 않는 경우(또는 2D 렌더링은 사용하고 물리는 사용하지 않는 경우) 2D 또는 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 릴리스에 ZIP 아카이브를 배포할 때 관련이 있습니다.

Steam과 같은 플랫폼은 이미 자체 압축 방식을 적용하고 있으므로 처음부터 파일을 배포하기 위해 ZIP 아카이브를 만들 필요가 없습니다.

여담으로, 프로젝트 자체의 배포 최적화를 살펴볼 수 있습니다. 이는 내보내기 템플릿을 다시 컴파일하지 않고도 수행할 수 있습니다.

`7-Zip <https://7-zip.org/>`__을 사용하면 평소보다 더 효율적인 ZIP 아카이브를 생성하는 동시에 모든 ZIP 추출기(Windows 자체 내장 추출기 포함)와 호환됩니다. 대규모 프로젝트의 ZIP 크기 감소는 일반적인 ZIP 압축기에 비해 수십 메가바이트에 달할 수 있지만 평균 절감 효과는 1~5MB 범위입니다. 이 ZIP 아카이브를 생성하는 것은 평소보다 시간이 더 걸리지만 다른 ZIP 아카이브만큼 빠르게 추출됩니다.

7-Zip GUI를 사용하는 경우 Ultra 압축 모드로 ZIP 아카이브를 생성하면 됩니다. 명령줄을 사용하는 경우 다음 명령을 사용하여 이 작업을 수행합니다.

7z a -mx9 my_project.zip folder_containing_executable_and_pck

웹 내보내기의 모든 파일 형식(특히 .wasm.pck)에 대해 gzip 또는 Brotli 압축을 활성화하면 다운로드 크기가 크게 줄어들어 특히 느린 연결에서 로딩 시간이 더 빨라질 수 있습니다.

높은 압축 수준으로 사전 압축된 gzip 또는 Brotli 파일을 생성하는 것은 해당 파일이 존재할 때 해당 파일을 제공하도록 웹 서버가 구성되어 있는 한 훨씬 더 효율적일 수 있습니다. 지원되는 경우 파일 크기를 줄일 수 있는 잠재력이 더 큰 Brotli가 gzip보다 선호됩니다.

자세한 설명은 프로젝트 내보내기 를 참고하세요.