社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
现代的游戏引擎都支持多平台,既然要支持多平台的话,自定义的构建系统在引擎工具链上就必不可少了。比如Unity需要同时支持C#,C++语言的编译,由此引入了Jamplus以及后来自己基于Jam和C#改造的UnityBuildSystem构建系统,Unreal则基于自己的需求(UHT生成)开发了UBT;CryEngine则是基于CMake修改了一套构建系统。
游戏引擎涉及的编程语言也会比较多,一般会用**C++/C/ObjC/ObjC++**写核心代码,其他语言写工具链和框架。
Kaleido3D 是一个笔者业余时间写的跨平台的3D图形库,由于要同时支持Android、iOS平台,开发过程中不停的电脑切换容易打断工作,影响开发效率,所以突发奇想想到了在Windows上开发iOS程序,那也需要在Windows上构建iOS代码,因此开了个新坑:XBuild。
现有跨平台构建工具主要有:
iOS程序的构建主要基于Clang-LLVM体系,由于这套CFamily的工具链开源,因此网友开发了iOS Build Environment套件用于在Windows系统构建iOS应用(虽然违反了苹果的规定)。
说到开发,少不了一个好用的IDE用于代码编辑。这里考虑使用VSCode用于Windows下ObjC的代码编辑,VSCode支持微软开发的Language Server Protocol提供的代码提示补全高亮的协议,而相应的LLVM下也正在实现基于LSP的ClangD用于跨平台跨编辑器的代码编辑。
笔者曾有幸参与UE4的引擎优化开发,在开发过程中尝尽了漫长的编译时间等待以及资源打包带来的痛苦,为此如何提高引擎/游戏开发和迭代效率成为了XBuild的目标。
经过几个月的开发,IrisBuild套件有了雏形,其中借鉴了Google家的Ninja以及GN的特性,在此基础上简化了不少功能,形成了现在的语法。
cproj("kCore") {
type = "shared_lib"
srcs = [
"Base/**.h",
"Base/*.cpp",
"XPlatform/**.h",
"XPlatform/**.cpp"
]
private = {
defines = [ "LIB_BUILD=1", "BUILD_SHARED_LIB=1" ]
}
match(${target_os}) {
"windows" => {
defines = ["K3DPLATFORM_OS_WIN=1","K3D_USE_SSE=1"]
srcs += "../Platform/Microsoft/Win32/**.cpp"
}
"android" => {
defines = ["K3DPLATFORM_OS_ANDROID=1", "K3D_USE_NEON=1"]
srcs += "../Platform/Android/cpp/**.cpp"
}
"ios" => {
defines = ["K3DPLATFORM_OS_IOS=1", "K3D_USE_NEON=1"]
srcs += "../Platform/Apple/iOS/**.mm"
srcs += "../Platform/Apple/CpuUsage.mm"
}
"macos" | "linux" => {
defines = ["K3DPLATFORM_OS_MAC=1", "K3D_USE_SSE=1"]
srcs += "../Platform/Apple/MacOS/**.cpp"
srcs += "../Platform/Apple/CpuUsage.mm"
}
"linux" => {
defines = ["K3DPLATFORM_OS_LINUX=1", "K3D_USE_SSE=1"]
srcs += "../Platform/Linux/**.cpp"
}
}
srcs = list_files(srcs)
inc_dirs = [ "." ]
on_init = () {
url = "https://ci.appveyor.com/api/projects/tomicyo/third-party-clibs/artifacts/build/third_party_clibs_windows_shared.zip"
download_and_extract(url, "${build_dir}/third_party")
glslang_url = "https://ci.appveyor.com/api/projects/tomicyo/glslang/artifacts/build/install/glslang-x64-Release.zip?job=Configuration%3A+Release"
download_and_extract(glslang_url, "${build_dir}/third_party")
}
}
这是简单的一个示例工程脚本,相比GN的语法描述更清晰和简洁,IrisBuild同样提供不少内置函数。
他相比于GN以及其他工具对跨平台开发的支持更方便和完善。
生成VS工程目录
Android Native 代码开发
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!