作为一个复杂的跨平台项目,首先要支持Windows下的Visual Studio开发,Mac下的XCode开发,新版IDE(集成开发环境)可以快速迁移过去,或者计划使用一个具体编译游戏程序可以通过从IDE中移除内置工具,在不同平台下顺利发布。同时,在项目结构上,我们也希望尽可能的简单、直接、清晰。比如我们设计了一些名为 Binary 和 Intermediate 的文件夹来存放编译后的二进制文件和临时文件;比如我们可以根据引擎功能模块构建Rendering。 、Physical、Audio等文件夹将代码存放在不同的类别中,然后根据目录结构自动将其包含到项目中。我们需要使用现代的制作工具来做这些事情。
制作工具简介
开发人员将在早期使用 IDE 进行开发工作。比如我在初学者阶段写了一个绘制2D/3D图形的窗口程序时,我会搜索谷歌如何使用Visual Studio菜单中的这么多设置选项去达到某个目的。 make工具通过编写makefile脚本来完成,然后通过不同IDE自带的make工具生成相同配置的工程文件,比如VS的.sln。 VS的Make工具叫nmake3D交通工具,linux下常用make。
cmakepremakexmakebazelsconsninjaautoconf…
从这些工具中挑选,我倾向于使用非DSL的make工具来制作makefile脚本,所以我不喜欢最常见的cmake。我觉得premake或者xmake是两个可以尝试的make工具,bazel也可以尝试。
考虑到我们目前经常处理的RHI,bgfx也是premake的一个分支版本,用法基本一样,所以我选择了premake,这样我们只需要学习一次,就可以同时理解了bgfx 构建和构建我们自己的引擎项目有两个要求。
如果我们在开发过程中遇到麻烦的问题,我们会考虑提交PR到premake,或者切换到xmake之类的试试。
卢阿
在学习Premake之前,可以快速了解lua的语法。 Lua 经常用于游戏开发。这种语言的特点是很容易作为脚本模块集成到您自己的 C/C++ 项目中。与python被设计成可以独立开发应用的完整语言不同,lua除了基本语法和一些系统功能外没有库,因为它的目的是轻量级,作为脚本模块嵌入到项目中,需要支持哪些功能完全由项目自己定制,也就是项目自己将C/C++接口绑定到lua层。
像早期的游戏引擎/软件开发一样,有些软件会定制一种简单的脚本语言,编写相应的解释器,然后将脚本开放给用户或上层开发者。比如 Maya 的 mel 脚本,或者一些游戏引擎的自定义脚本。 lua的出现主要是让这些项目的开发者不必自己设计新的脚本语言来实现统一。至于经常提到的热更新的优点,因为lua是在没有开启luaJIT的情况下纯解释执行的,而且大部分脚本语言都有纯解释执行的模式,所以热更新不是使用的理由lua.
另外,如果你对编程语言设计感兴趣,可以自己编译lua源码游戏引擎编辑器,调试一下看看效果如何。 Lua也是一个非常适合初学者学习的开源语言项目。总共只有大约 10,000 个代码。它可以让开发者快速掌控全局或神奇的变化,这也是选择lua作为脚本模块的一个原因。
对于premake的使用,我们只需要学习简单的lua特性:
什么是 stringniltablefunction 变量命名的好命名法?在if分支、for循环、while循环等控制结构的编写中如何定义全局变量,全局变量可以跨越不同的lua文件,为什么呢? (_G表) 如何使用多个lua文件游戏运营,dofile和require是什么?内置库的简单API,如获取当前时间、获取当前工作目录、文件操作等Premake超出premake使用要求的部分
premake搭建项目需要准备两件东西,一个是premake5.exe(5号对应当前premake版本),里面集成了一个lua解释器,根据premake api翻译到不同的IDE,逻辑平台工程规则,使用时会默认寻找premake5.lua作为程序入口。
以在 Visual Studio 2022 中构建一个带有单个 main.cpp 的控制台程序为例,我们要做的步骤是:
构建,运行
我们使用 Premake 来练习上面的步骤:
目录结构为:
Tutorials.sln 会出现在这里
premake5.lua 是:
1
2
3
4
5
6
7
8
9
10
11
12
workspace("Tutorials")
configurations { "Debug", "Release" }
project("Tutorial0-HelloWorld")
kind("ConsoleApp")
language("C++")
cppdialect("C++17")
targetdir("bin")
files {
"source/main.cpp"
}
简单解释一下,workspace对应解决方案的概念,是多个项目的容器;配置是项目构建的配置类型; project是项目描述,kind可以指定不同类型的项目,比如ConsoleApp是一个控制台应用;语言为C++时使用language和cppdialect,使用的版本为C++ 17; targetdir 是项目构建生成的二进制文件存放的目录; files 用于将代码文件添加到项目中。
premake脚本通过从上到下调用premake api来描述项目。具体的api可以在文档中找到:.
运行premake命令并运行sln后游戏引擎编辑器,我们的目录变成:
binobjTutorial0-HelloWorld.vcxprojTutorials.sln
至此,我们已经完成了基于premake的最简单的C++项目框架。这里还有一些新的改进可以推导出来:
欢迎提出更多关于如何改进premake项目的问题,后续会以问题+解决方案的形式更新。
游戏引擎项目目录设计
以下是目前项目整体目录结构的设计,以Visual Stuido为例:
ConfigEngineIntermediate:生成的临时文件Source:引擎源代码ModelLoaderRuntime:游戏引擎项目的Premake准备,需要区分私有和公共apiThirdPartysdl2openal-softEngine.sln
上面的项目目录基本就完成了,形成博客还需要很多时间,待定
参考文献