Hacker News기타

Godot에서 C++ 라이브러리 쓰기, Conan과 godot-cpp 10으로

원제 Using any C++ library in Godot

112 포인트댓글 30
Key Point

C++ 라이브러리를 Godot 게임에 통합할 때 각 플랫폼마다 빌드하는 번거로움을 Conan으로 완전히 자동화하는 방법을 보여주므로, 고성능 기능이 필요한 Godot 개발자에게 실무적 가치가 있다.

핵심 요약

  • Godot는 무료 오픈소스 게임 엔진이지만 GDScript는 네이티브 코드를 직접 호출할 수 없어, C++ 라이브러리를 쓰려면 GDExtension을 통해 로드해야 한다.
  • GDExtension에 노출된 코드는 godot-cpp 공식 C++ 바인딩으로 일반적인 엔진 클래스처럼 작동하며, 문제는 godot-cpp가 Godot 버전과 일치해야 하고 모든 라이브러리를 각 플랫폼마다 컴파일해야 한다는 점이다.
  • godot-cpp 10.0부터는 단일 릴리스로 Godot 4.3 이상 모든 버전을 지원하며, api_version 빌드 옵션으로 호환성 버전을 선택한다.
  • godot-cpp는 template_debug(에디터/디버그 빌드용), template_release(릴리스 빌드용), editor(에디터 전용) 세 가지 타겟으로 컴파일되며, .gdextension 파일의 feature 태그가 플랫폼과 모드에 따라 로드할 라이브러리를 결정한다.
  • 기존 방식은 godot-cpp를 git 서브모듈로 추가해 각 프로젝트마다 컴파일하고 써드파티 라이브러리를 벤더링해야 하는 번거로움이 있다.
  • ConanCenter의 godot-cpp 레시피로 godot-cpp가 일반 패키지가 되며, api_version과 target 옵션으로 의존성 조합을 관리하고 모든 프로젝트가 동일하게 컴파일된 바이너리를 재사용한다.
  • 실전 예제는 flecs(Entity Component System 라이브러리)로 10만 개 파티클을 시뮬레이션하는 Swarm 노드를 만드는데, ECS는 같은 타입의 컴포넌트를 메모리에 연속으로 저장해 대량의 엔티티 반복이 빠르다.
  • conanfile.py에서 godot-cpp와 flecs를 요구하고, CMakeLists.txt에서 표준 CMake로 공유 라이브러리를 빌드하며, godot-cpp의 target 옵션을 읽어 출력 파일 이름을 일치시킨다.
  • Swarm 클래스는 Node2D를 상속하고 flecs 월드를 소유하며, _bind_methods()에서 count와 flee_radius 프로퍼티를 선언하면 인스펙터에서 편집할 수 있다.
  • _ready()에서 파티클마다 flecs 엔티티를 생성하고 MultiMesh로 한 번에 그리며, _process()에서 마우스 위치를 전달하고 시스템을 실행한 뒤 위치를 MultiMesh 버퍼에 복사한다.
  • GDREGISTER_RUNTIME_CLASS는 런타임 클래스를 등록하며, 에디터에서는 플레이스홀더만 표시되고 게임 실행 중에만 코드가 작동한다.
  • 단일 명령 'conan build . --build=missing'으로 godot-cpp와 flecs를 해결하고 바이너리를 다운로드하며 부재한 부분을 소스에서 빌드한 뒤 확장을 컴파일한다.
  • godot-cpp는 C++17이 필요하며, MSVC 기본 프로필은 '-s compiler.cppstd=17' 옵션을 추가해야 한다.
  • Linux에서는 확장이 libstdc++을 동적으로 링크하므로 지원하려는 가장 오래된 배포판과 호환되는 툴체인으로 빌드하거나 libstdc++을 정적으로 링크해 기호를 숨겨야 한다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗