用 Rust 从零开始写一个游戏引擎(二)

上一集预告这一集需要开始写内存管理系统。其实一般不推荐 Rust 直接写游戏引擎。所以我们先开始用实现一个游戏来开始。并且将其中可复用的东西抽离出来。然后我们就可以获得一个游戏引擎。虽说很简陋。

构思阶段

首先要实现一个简单但是又不会太简单的游戏。我首先想到了推箱子。推箱子的开源代码极其之多,而且可以参考借鉴的地方非常之多。但是它实在是过度简陋。然后我想到了一系列已经开源的游戏引擎。最后,我把目标锁定在——声音寻路。虽说它并不是开源的,但是在我的游玩历史中,它可以说是让我最喜欢的一款了。
虽说它的内容很大,但是实际上其中素材占比非常大。

Rust 引擎系统基础集成

游戏在进行过程中,我们首先考虑子系统,也就是各个服务的先后开启,关闭次序。不同的次序会影响系统的执行性能。

而最常见的的设计模式是将每个子系统定义为单例类(singleton class)(通常被称作管理器/manager) ——《游戏引擎架构》

我们要考虑用以下各子系统的形式构建:

  • 内存管理系统
  • 文件系统
  • 音频系统
  • 游戏性系统
    其中内存管理系统最为难写。这是其一,但是已经有别人已经实现的轮子。因此也是相对来说比较方便。
    文件系统,这是其二。不管是哪些文件,需要先后顺序的,都需要文件系统批量管理。
    而音频系统与游戏性系统,构建起游戏的核心游玩基础。已经自动编写音乐的 AI 系统也是重中之重。

引擎的一些边边角角

上边没有说的还有渲染系统人体学接口设备系统
渲染系统作为所有游戏中最为重要,也是涉及知识最多的系统。在我看来是极为重要的。
已经有比较好的实现有 Ogre 渲染系统。虽说是3D的,但是它的代码规范,还有渲染实现代码都值得我们学习。

实现阶段前的分析

让我们看一下 Ogre 的一些实现代码。

OrgeRoot.h

1
2
3
4
5
6
7
8
9
10
11
class _OgreExport Root : public Singleton<Root>
{
// <忽略一些代码......>

// 各单例
LogManager* mLogManager; //并非原代码
ControllerManager* mControllerManager;
SceneManagerEnumerator* mSceneManagerEnumerator;
SceneManager* mCurrentSceneManager;
等等
}

OgreRoot.cpp

1
2
3
4
5
6
7
....
if (LogManager::getSingletonPtr() == 0)
{
mLogManager = new LogManager();
mLogManager->createLog(logFileName,true,true);
}//如果没有日志管理员,建立日志管理员及默认日志文件
....

由上,我们可以知道,OGRE 的一切子系统都是由 Ogre::Root 单例控制。这个单例会带着指向其它子系统的指针,因此在其启动后,程序员/程序能够根据预定的顺序轻松地对相关的内容进行处理。
我们打算采用这种集中管理的模式。但是将会使用分布地进行各个子系统的处理。

0DE71B6FFF63F7E000ADB9C785E4FB82.gifRust 游戏引擎

在下一节中,我将分享 RsgeRoot.rs 的构建与编写过程。以及分享相关的流程图。

参考文献

[1]游戏引擎架构

本文作者: Bon
本文地址https://bonxg.com/p/11.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!

# Bon
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×