软件科学-郝学胜头像
关注
游戏引擎架构 001:从团队分工到底层架构封面图

游戏引擎架构 001:从团队分工到底层架构

摘要:当我们沉浸在 3A 大作宏大的虚拟世界中,惊叹于逼真的光影、流畅的角色动作、拳拳到肉的物理反馈时,这一切的背后,是一套无比庞大、错综复杂的软件巨兽 —— 游戏引擎。很多人只听过虚幻、Unity 的大名,却很少看透引擎内部完整的全貌。本文基于《游戏引擎架构》第一章内容,带大家剥开游戏引擎的外壳,聊聊引擎是什么、开发团队如何协作、不同游戏品类带来的技术取舍,再逐层剖析运行时架构与内容资产管线,还附带部分关键 C++ 伪代码帮助理解核心设计思想。

🎮 回溯几十年前,电子游戏还只是大众眼中的 “小孩子玩具”。早期主机硬件性能孱弱,软件与硬件深度绑定,不存在 “游戏引擎” 这个概念,每一款游戏几乎都是从零写死全部逻辑。

时光来到 2008 年,游戏产业已经成长为百亿级别的文化产业,规模足以和好莱坞分庭抗礼。Doom、Quake 横空出世,第一次把渲染、物理、音频等底层能力和游戏美术资源、玩法规则做了解耦,“游戏引擎” 这个名词正式登上历史舞台。时至今日,虚幻、Source、Unity、寒霜等引擎已经成为标准化可授权的软件开发套件,无数工作室站在巨人肩膀上,创造出一个个天马行空的虚拟世界。

不过千万不要以为所有引擎都是一套万能模板。虽然各家引擎代码实现千差万别,但万变不离其宗:渲染系统、物理碰撞、动画系统、音频、AI、游戏对象模型…… 这些模块几乎是每一款工业级引擎的标配。

市面上很多技术书籍,要么只讲解图形渲染某一个细分方向,要么堆砌零散的技术技巧。想要搞懂一整套完整工业级引擎全貌,需要串联起团队组织、业务需求、底层代码、内容生产管线等方方面面。

Bilibili 同步视频

游戏引擎架构 001:从团队分工到底层架构

🧑‍💻 游戏不是程序员一个人的狂欢:游戏工作室是怎么运转的?

一款游戏的诞生,绝不是一群程序员关起门敲代码就能搞定。一个标准的游戏工作室,由工程师、美术、游戏设计师、制作人以及支持团队共同构成,每个岗位环环相扣。

1. 工程师:引擎世界的建造者

工程师群体内部也有清晰的划分,简单可以分为运行时程序员和工具程序员。

  • 运行时程序员:负责引擎内核与游戏逻辑,深耕渲染、物理、AI、游戏玩法脚本等各个子模块;

  • 工具程序员:写各式各样离线工具,服务美术与策划,提升整个团队生产效率。

同时岗位也有管理链路:普通工程师→首席工程师(编码 + 把控项目技术方向)→技术总监 TD(评估技术风险,跟进行业新技术)→CTO,统筹整个工作室的技术路线。

💡很多游戏公司还会区分「引擎程序员」和「游戏性程序员」。引擎程序员关心底层系统性能;游戏性程序员更多聚焦玩家游玩逻辑。

2. 艺术家:内容为王,撑起游戏的皮囊

游戏圈流传一句话:内容为王。所有我们眼睛看到、耳朵听到的一切,全部来自美术团队。
概念艺术家绘制原画定调美术风格;3D 建模师分为前景(角色、武器)和环境建模师;纹理师为模型赋予皮肤;灯光师调配场景光影;动画师赋予角色生命;还有音效、作曲、配音演员共同构筑听觉体验。艺术总监把控全部产出,保证千万份美术资产风格统一。

3. 游戏设计师:虚拟世界的规则制定者

设计师负责定义玩家全部交互体验。有人负责宏观故事大纲,有人作为关卡设计师摆放敌人、道具、谜题;还有技术向设计师,和程序员紧密协作落地玩法逻辑。游戏总监则保证整个游戏设计逻辑自洽。

4. 制作人 & 发行生态

制作人的职责在不同工作室差异巨大:管控项目进度、充当业务和开发团队的桥梁,甚至深度参与设计;也有部分工作室,例如顽皮狗,没有专职制作人,由资深全员分担管理工作。

而发行商(EA、索尼、任天堂等)负责游戏市场宣发、生产分销。工作室分为独立外包工作室、发行商全资子公司,还有第一方开发商(例如顽皮狗直属于索尼,只为自家主机开发游戏)。

🕹️ 电子游戏本质:一套软实时的代理模拟系统

那么,电子游戏到底是什么?
从计算机科学视角来看:绝大多数 3D 电子游戏,是一套软实时、交互式、基于代理的计算机模拟系统。

  • ✅基于代理:游戏世界中角色、怪物、子弹、载具都是独立 “代理 Agent”,各自拥有状态、行为,互相交互。这也是为什么游戏开发大量使用面向对象编程。
// C++伪代码:游戏代理(游戏对象)的基础抽象
class GameAgent
{
public:
    // 每一帧更新代理状态 deltaTime为帧间隔时间
    virtual void update(float deltaTime) = 0;
    virtual void render() = 0;
    virtual ~GameAgent() = default;

protected:
    Vector3 m_pos;     // 位置
    Vector3 m_velocity;// 速度
};
  • ✅时间性模拟:整个世界状态随着时间持续变化,同时要接收玩家不可预测的输入。

  • ✅软实时系统:系统有严格的时间 deadline。例如游戏要维持 60 帧,意味着每帧最多只能跑 16.6ms;物理模拟可能 1 秒要迭代 120 次。

重点区分:软实时错过时限不会造成现实生命危险(游戏掉帧);硬实时系统(航空电子、核反应堆)超时会酿成事故,游戏属于典型软实时。

游戏世界的模拟有两种数学建模思路:

  1. 分析式(闭式公式):给定时间 t,直接算出结果,比如自由落体公式 y ( t ) = f r a c 12 g t 2 + v 0 t + y 0 y(t)=frac12gt^2+v_0t+y_0 y(t)=frac12gt2+v0​t+y0​;

  2. 数值式迭代:依靠当前时刻状态,推算下一个时间步长的状态。

现实游戏几乎全部使用数值迭代,也就是大名鼎鼎的游戏循环 Game Loop。

// C++ 简化版游戏主循环伪代码
int main()
{
    initEngine(); // 初始化引擎各个子系统
    while (!isGameExit())
    {
        float deltaTime = getDeltaTime();
        handlePlayerInput();       // 处理玩家输入
        updateGameLogic(deltaTime);// 更新游戏逻辑、AI
        physicsWorld->step(deltaTime); // 物理模拟步进
        renderSystem->drawScene(); // 渲染画面
        audioSystem->tick();       // 音频更新
    }
    shutdownEngine();
    return 0;
}

每一轮循环,AI、物理、游戏逻辑更新状态,最后输出图像、声音到硬件设备。

⚙️游戏引擎:不是万能的魔法盒子,通用性永远要付出代价

“游戏引擎” 这个词汇诞生于 90 年代 Doom 时代。id Software 开创性把底层核心组件和游戏内容解耦。开发者拿到引擎,只需要替换美术、关卡、武器规则,就能做出一款全新游戏,也催生了热闹的 MOD 社区。

但是!引擎和游戏的分界线永远是模糊的。
如果大量玩法逻辑硬编码写死在底层,这套软件复用性就极差;数据驱动架构 Data‑Driven Architecture就是用来解决这个痛点:尽量把规则、配置放到数据文件,引擎通用代码不去写死特定游戏逻辑。

引擎的复用能力是一条连续光谱,不存在非黑即白。同时这里有一个非常重要的工程权衡:

📌引擎通用性越强,针对特定场景的极限性能往往就越低。

举个例子:传统室内 FPS 引擎大量使用 BSP 树做遮挡剔除,擅长渲染密闭房间;这套算法放到一望无际的开放世界,效率就会大打折扣。
硬件性能飞速发展,让这种差距不断缩小,但取舍永远存在。

不同游戏品类,对引擎的技术侧重天差地别:

  • FPS 射击游戏:对渲染、物理、动画、多人联机全方面高要求;既要处理密闭室内,又要兼顾广阔野外大世界;

  • 第三人称 / 平台动作游戏:不只是第一视角手臂动画,需要完整全身角色动画,还有一套复杂防穿模的跟随摄像机系统;

  • 格斗游戏:场景小,但是攻击判定、复杂按键输入检测要求极高;高端格斗还会加入皮肤次表面散射、布料模拟;

  • 竞速游戏:载具物理模拟,高速场景的远景渲染优化;赛道分区数据结构辅助 AI 寻路;

  • RTS 实时策略:需要同时渲染成百上千个作战单位,大量使用高度图地形;

  • MMO 大型多人在线:核心压力在服务器,维护持久游戏世界,处理成千上万玩家同步、登录、交易,渲染画质往往会做出妥协;

  • 玩家创作向游戏(Minecraft、小小大星球):引擎重点放在编辑器,支持玩家自由编辑、导出分享内容。

🏗️ 剖开引擎内脏:现代 3D 游戏运行时分层架构

一款完整的工业游戏引擎是一座巨大的分层软件大厦,遵循上层依赖下层,尽量规避循环依赖的原则。自底向上依次为:

1. 硬件层、驱动层、操作系统层

最底层是各式各样硬件:PC、主机、移动设备。驱动负责隔离硬件差异。
PC 操作系统是抢占式多任务,游戏需要和其他程序抢夺硬件资源;传统游戏主机游戏独占全部硬件,现代主机系统也会抢占资源弹出系统弹窗。

2. 第三方 SDK 与中间件

成熟引擎几乎不会重复造轮子,大量引入业界成熟中间件:

  • 数据结构:STL、Boost。⚠️注意:游戏主机开发环境,STL 容易产生内存碎片,很多团队会自研容器。
// 简单自定义内存分配器接口,游戏引擎常见设计,规避STL内存碎片
class IGameAllocator
{
public:
    virtual void* allocate(size_t size, size_t align) = 0;
    virtual void deallocate(void* ptr) = 0;
};
  • 图形:DirectX / OpenGL;

  • 物理碰撞:Havok、PhysX、Bullet;

  • 动画中间件:Granny、Euphoria 生物力学动画;

  • AI 导航中间件:Kynapse;

3. 平台独立层

封装操作系统、系统库之间的差异,给上层引擎一套统一 API,实现一套代码跑多平台。

4. 核心系统 Core System

引擎的工具箱:断言调试、自定义内存分配器、高性能数学库(向量、矩阵、四元数)、字符串、随机数、性能统计。整个引擎所有模块都依赖这一层。

5. 资源管理器

统一管理海量游戏资产:模型、贴图、动画、音效,处理资源加载、卸载、压缩包读取。

6. 渲染引擎

渲染引擎本身又细分为多层:

  1. 低阶渲染器:图形设备接口、材质着色器、光照、摄像机,提交几何图元;

  2. 场景图 & 剔除优化:BSP、八叉树、四叉树、PVS 潜在可见集。把摄像机看不见的物体提前剔除,拯救性能;

  3. 视觉效果层:粒子烟火、贴花弹孔、动态阴影、HDR、全屏后期特效;

  4. 前端 UI 层:HUD 血条、游戏 GUI 菜单、游戏内实时过场 IGC、预录全动视频 FMV。

7. 性能剖析 & 调试工具

游戏是实时系统,性能就是生命线。引擎会内置一整套调试工具:内存统计、性能采样、游戏录放回放、游戏内控制台,帮助开发者定位卡顿、内存泄漏。

8. 碰撞物理系统

处理物体相交检测、刚体动力学、布娃娃死亡物理。绝大多数商业项目直接使用第三方物理中间件。

9. 骨骼动画系统

现代 3D 游戏的灵魂。实现动画状态树、动画混合、IK 反向动力学,最后输出矩阵调色板交给渲染器做蒙皮计算。

10.HID 人体输入设备

处理键盘、鼠标、游戏手柄、方向盘;处理摇杆死区、按键消抖动,把底层硬件输入映射成游戏的逻辑操作,还支持手柄震动输出。

11. 音频子系统

经常被程序员忽视,但极大影响沉浸感。负责 3D 空间音频、音效 DSP 处理、音频播放管理。

12. 在线多人网络子系统

支持分屏本地多人、网络联机、大型多人服务器。包含匹配管理、对象权限、游戏状态同步复制。

⚠️重要工程经验:多人模式最好项目初期就设计。后期把单人引擎硬改成多人,代价会无比惨痛。

13. 游戏性基础层

引擎底层和游戏玩法之间的缓冲层。包含游戏对象模型、事件消息系统、脚本系统、AI 基础组件。脚本系统允许策划修改玩法逻辑,不需要重新编译 C++ 引擎代码。

14. 游戏专用子系统

架构最顶层,完全属于具体游戏本身:专属武器逻辑、特有摄像机、定制 AI 行为。理论上引擎与游戏的分界线就在这一层,但实际项目中,游戏的特殊需求总会向下渗透到底层引擎。

📦 不止运行游戏:资产管线,被很多人忽略的另一半引擎!

很多人误以为游戏引擎 = 游戏运行程序。完整游戏引擎 = 运行时程序 + 整套内容制作工具链。

美术不会直接在引擎里面画模型,他们使用 DCC 工具:Maya/3dsMax 建模,Photoshop 绘制纹理,Houdini 做特效,Sound Forge 制作音频。
但是 DCC 源文件格式复杂、体积庞大,无法直接丢进游戏里跑。于是就有了资产调节管道。

资产管线负责把原始美术资源导出、转换、压缩、分平台优化,输出引擎可以快速读取的资源格式。网格、骨骼动画、音频、粒子资源都要经过这条流水线加工。

除此之外引擎工具链还包含:

  1. 世界编辑器:搭建游戏关卡,例如 Source 的 Hammer 编辑器,虚幻的 UnrealEd;

  2. 资源数据库:保存资产元数据(动画循环标记、压缩等级、资源唯一 ID);

  3. 多种多样工具架构:

    • 方案 1:工具完全独立运行;

    • 方案 2:工具与运行时引擎共享底层核心库;

    • 方案 3:工具嵌入运行引擎内部(虚幻 UnrealEd)。好处是可以游戏内实时编辑,坏处引擎崩溃编辑器也跟着挂掉。

如今越来越多团队使用网页端工具做任务管理、日志查看、本地化翻译。网页工具无需安装,浏览器直接访问,对外包协作非常友好;但复杂 3D 可视化任务,仍然离不开传统客户端 GUI。

📝写在最后

游戏引擎是软件工程领域的集大成者。它融合图形学、物理、动画、网络、内存管理,同时还要服务工程师、美术、设计师不同角色。

不存在完美的 “万能引擎”。每一处架构选择,背后都是需求、性能、开发效率之间的权衡。
看懂引擎分层,理解引擎与游戏的边界,理解工具管线和运行时同等重要,才算真正跨过游戏引擎的第一道门槛。

游戏引擎架构 001:从团队分工到底层架构

拓展思考:如果你要从零设计一款小型 3D 引擎,你会优先实现哪些模块?哪些模块直接选用第三方中间件?

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2503_92624912/article/details/166492910

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--