Godot4之编译和使用iOS插件

345 阅读2分钟

本篇是自己在Godot3升级Godot4过程中,iOS插件部分的研究学习笔记。

首先 官网的文档教程 ,其实比较详细的,工作之前,建议详细阅读一下。

一.获取源码

Godot的官网和GitHub地址,通过GitHub的Releases或tags下载代码,比如这次下载4.1.1-stable代码

// 官网:
https://godotengine.org/

// GitHub仓库:
https://github.com/godotengine/godot

如果使用git拉取代码时,可以只拉取对应的分支,这样速度更快:

# You can add the --depth 1 argument to omit the commit history.
# Faster, but not all Git operations (like blame) will work.
git clone https://github.com/godotengine/godot.git

# Clone the continuously maintained stable branch (`3.x` as of writing).
git clone https://github.com/godotengine/godot.git -b 3.x

# Clone the `4.1.1-stable` tag. This is a fixed revision that will never change.
git clone https://github.com/godotengine/godot.git -b 4.1.1-stable

二.编译iOS模板

进入Godot代码根目录,代码结构如下 (分支:4.1.1-stable

$ cd godot-4.1.1-stable
$ tree -a -L 1
.
├── .clang-format
├── .clang-tidy
├── .editorconfig
├── .git-blame-ignore-revs
├── .gitattributes
├── .github
├── .gitignore
├── .lgtm.yml
├── .mailmap
├── AUTHORS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── COPYRIGHT.txt
├── DONORS.md
├── LICENSE.txt
├── LOGO_LICENSE.md
├── README.md
├── SConstruct  # 这个文件Scons构建系统入口
├── core  # 主要核心代码
├── doc
├── drivers
├── editor  # 编辑器代码
├── gles3_builders.py
├── glsl_builders.py
├── icon.png
├── icon.svg
├── icon_outlined.png
├── icon_outlined.svg
├── logo.png
├── logo.svg
├── logo_outlined.png
├── logo_outlined.svg
├── main  # 引擎入口
├── methods.py
├── misc
├── modules
├── platform  # 各个平台适配,例如iOS、Android
├── platform_methods.py
├── scene  # Godot的组件代码,比如UI等节点
├── scu_builders.py
├── servers
├── tests
├── thirdparty
└── version.py

2.1 Scons构建系统

Godot使用 SCons构建系统 ,SCons是Python实现的,所以需要提前安装Python3环境,我使用的是Mac,使用brew很容易安装二者:

# 注意先安装Xcode,至少也装Command Line Tools,例如:
$ xcode-select —-install

# brew官网:
# https://brew.sh/

# 利用brew安装Python3(也可以直接去官网安装Python包)
$ brew install python3
$ python3 --version  # 会输出安装的Python3的版本号。
Python 3.11.2

$ brew info python3  # 查看Python3安装信息

$ brew install scons  # 安装 scons 构建系统
$ scons --version  # 查看 scons 的版本信息

SCons by Steven Knight et al.:
	SCons: v4.5.2.120fd4f633e9ef3cafbc0fec35306d7555ffd1db, Tue, 21 Mar 2023 12:11:27 -0400, by bdbaddog on M1DOG2021
	SCons path: ['/usr/local/Cellar/scons/4.5.2/libexec/lib/python3.11/site-packages/SCons']
Copyright (c) 2001 - 2023 The SCons Foundation

进入cd到代码根目录,使用scons构建系统,使用scons platform=list 可列出当前电脑环境可用的目标平台(我当前使用的Mac系统):

$ scons platform=list

scons: Reading SConscript files ...
The following platforms are available:

        ios
        macos

Please run SCons again and select a valid platform: platform=<string>

使用scons platform=xx 开始构建,其中platform=可以简写为p=,例如

$ scons platform=ios

# ⚠️如果想使用多线程加速构建,例如加`-j`参数,例如使用6核CPU构建:
$ scons platform=ios -j6

# -j6 也可以改有几个CPU就全部使用,不过编译期间可能电脑会卡
$ scons platform=ios --jobs=$(sysctl -n hw.logicalcpu)

# ⚠️构建的结果,会在根目录下的`bin/`目录下

2.2 Scons构建参数

可以先进入Godot代码目录,使用scons --help看看大概有哪些参数,以及参数的解释。我第一次执行时,保存了,因为电脑没装vulkan,Godot4使用vulkan为默认渲染后端。

Mac安装vulkan直接去官网下载SDK的dmg包安装即可 vulkan.lunarg.com/ www.lunarg.com/vulkan-sdk/

参数Target

生成的二进制文件,是否包含编辑器模块,三个值:editortemplate_debugtemplate_release

  • editor:编译带有编辑器模块,默认PC目标(Linux、Windows、macOS)时,会启用,其他平台则是不启用。
  • template_debug:带有 C++ 调试符号(C++ debugging symbols)构建
  • template_release:不带调试符号构建

例如写法:

scons platform=ios target=editor/template_debug/template_release

😄调试符号是被调试程序的二进制信息与源程序信息之间的桥梁,是在编译器将源文件编译为可执行程序的过程中为支持调试而摘录的调试信息。调试信息包括变量、类型、函数名、源代码行等。 符号表(又称“调试符”)的作用是将十六进制数转换为源代码行、函数名及变量名。符号表中还包括程序使用的类型信息。调试器使用类型信息可以获得原始数据,并将原始数据显示为程序中所定义的结构或变量。 符号表有很多格式,比如SYM格式、PDB格式、MAP文件 使用该命令从已编译的二进制文件中删除调试符号:strip <path/to/binary>

带有调试符号时,编译出来的包,往往非常大,当不想要调试符号时,也可以手动指定参数:

# 其实 debug_symbols 默认就是 false
scons platform=<platform> debug_symbols=no

开发和生产别名

一般情况下,开发包需要带有调试、分析工具,生产包需要二进制文件尽可能小、可能快。 Godot 为此提供了两个别名参数:

  • dev_mode=yes等价于verbose=yes warnings=extra werror=yes tests=yes,代表启用了警告作为错误的行为、并且还构建了单元测试。默认是False
  • production=yes等价于use_static_cpp=yes debug_symbols=no lto=auto,静态链接 libstdc++ 可以在针对 Linux 进行编译时实现更好的二进制可移植性。当使用 MinGW 编译 Linux、Web 和 Windows 时,此别名还可以启用链接时优化,但在使用 MSVC 编译 macOS、iOS 或 Windows 时保持禁用 LTO。这是因为这些平台上的 LTO 链接速度非常慢或者生成的代码存在问题。默认是False(LTO(Link Time Optimization))

当使用诸如production=yes这种别名时,也可以再跟上参数还覆盖里面的值,比如production=yes,但是还想要符号表:scons production=yes debug_symbols=yes

Dev build dev_build参数主要是用于引擎开发时,配合target参数使用,例如禁用优化、生成调试符号、启用assert()等。默认是False

CPU架构 比如arm64、x86_64等,例如scons platform=ios arch=arm64

清理编译之后的中间文件 两个清理的命令,根据情况,选择其中的即可:

  • scons --clean <options>,其中optionss是之前编译的平台,比如ios
  • git clean -fixd 利用git清理

2.3 Vulkan

Godot4需要 Vulkan 渲染,在iOS、MacOS上,需要MoltenVK库。MoltenVK库是是 Vulkan 可移植性实现,它将高性能、行业标准的 Vulkan 图形和计算 API 的子集置于 Apple Metal 图形框架之上,使 Vulkan 应用程序能够在 macOS、iOS 和 tvOS 上运行。

😄MoltenVK的代码和编译方法如下:

有个偷懒不用编译MoltenVK的2个方法:

  • MoltenVK的GitHub主页,在Releases里直接下载编译好的MoltenVK-ios.tar文件,里面有MoltenVK.xcframework
  • 下载对应Godot的编辑器模板,里面的iOS工程模板里,有MoltenVK.xcframework

😄Vulkan的官网

2.4 编译iOS平台引擎

编译iOS平台引擎:

scons p=ios target=template_debug ios_simulator=no debug_symbols=yes arch=arm64 -j6
# 上面这句编译出来是 1.37GB,因为带有符号表,特别大

scons p=ios target=template_debug arch=arm64 -j6
# 上面这句编译出来是 136.8Mb

scons p=ios target=template_release production=yes arch=arm64 -j6
# 上面这句编译出来是 126Mb

三.创建和编译iOS插件

Godot官方的iOS插件库是: github.com/godotengine…

截止我写笔记时,还没有更新到Godot4,经过研究,可以按照下面的方式进行成功构建。

纯命令简约版:

$ git clone --recursive https://github.com/godotengine/godot-ios-plugins.git godotIOSPlugins4

$ cd godotIOSPlugins4/godot/
$ git fetch
$ git checkout 9704596  # 这是切到Godot4.1,根据自己情况切换分支或commit节点
$ scons platform=ios target=template_debug  # 编译生成头文件,大概10秒后主动停止即可,没必要执行完毕

$ cd ..  # 去`godotIOSPlugins4`目录下
/godotIOSPlugins4 $ scons target=release_debug arch=arm64 plugin=icloud version=4.0
/godotIOSPlugins4 $ ./scripts/generate_static_library.sh icloud release_debug 4.0
/godotIOSPlugins4 $ ./scripts/generate_xcframework.sh icloud release_debug 4.0

# 上面的`icloud`是指的插件名,换成自己写的插件即可

.a文件生成.xcframework文件命令:

# 假如.a文件叫 GodotSkyBridge.arm64.a
$ xcodebuild -create-xcframework -library GodotSkyBridge.arm64.a -output GodotSkyBridge.xcframework