本篇是自己在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
生成的二进制文件,是否包含编辑器模块,三个值:editor
、template_debug
、template_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