免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

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

游戏引擎架构 001:从团队分工到底层架构 游戏引擎架构 001从团队分工到底层架构Bilibili 同步视频‍ 游戏不是程序员一个人的狂欢游戏工作室是怎么运转的1. 工程师引擎世界的建造者2. 艺术家内容为王撑起游戏的皮囊3. 游戏设计师虚拟世界的规则制定者4. 制作人 发行生态️ 电子游戏本质一套软实时的代理模拟系统⚙️游戏引擎不是万能的魔法盒子通用性永远要付出代价️ 剖开引擎内脏现代 3D 游戏运行时分层架构1. 硬件层、驱动层、操作系统层2. 第三方 SDK 与中间件3. 平台独立层4. 核心系统 Core System5. 资源管理器6. 渲染引擎7. 性能剖析 调试工具8. 碰撞物理系统9. 骨骼动画系统10.HID 人体输入设备11. 音频子系统12. 在线多人网络子系统13. 游戏性基础层14. 游戏专用子系统 不止运行游戏资产管线被很多人忽略的另一半引擎写在最后摘要当我们沉浸在 3A 大作宏大的虚拟世界中惊叹于逼真的光影、流畅的角色动作、拳拳到肉的物理反馈时这一切的背后是一套无比庞大、错综复杂的软件巨兽 —— 游戏引擎。很多人只听过虚幻、Unity 的大名却很少看透引擎内部完整的全貌。本文基于《游戏引擎架构》第一章内容带大家剥开游戏引擎的外壳聊聊引擎是什么、开发团队如何协作、不同游戏品类带来的技术取舍再逐层剖析运行时架构与内容资产管线还附带部分关键 C 伪代码帮助理解核心设计思想。 回溯几十年前电子游戏还只是大众眼中的 “小孩子玩具”。早期主机硬件性能孱弱软件与硬件深度绑定不存在 “游戏引擎” 这个概念每一款游戏几乎都是从零写死全部逻辑。时光来到 2008 年游戏产业已经成长为百亿级别的文化产业规模足以和好莱坞分庭抗礼。Doom、Quake 横空出世第一次把渲染、物理、音频等底层能力和游戏美术资源、玩法规则做了解耦“游戏引擎”这个名词正式登上历史舞台。时至今日虚幻、Source、Unity、寒霜等引擎已经成为标准化可授权的软件开发套件无数工作室站在巨人肩膀上创造出一个个天马行空的虚拟世界。不过千万不要以为所有引擎都是一套万能模板。虽然各家引擎代码实现千差万别但万变不离其宗渲染系统、物理碰撞、动画系统、音频、AI、游戏对象模型…… 这些模块几乎是每一款工业级引擎的标配。市面上很多技术书籍要么只讲解图形渲染某一个细分方向要么堆砌零散的技术技巧。想要搞懂一整套完整工业级引擎全貌需要串联起团队组织、业务需求、底层代码、内容生产管线等方方面面。Bilibili 同步视频游戏引擎架构 001从团队分工到底层架构‍ 游戏不是程序员一个人的狂欢游戏工作室是怎么运转的一款游戏的诞生绝不是一群程序员关起门敲代码就能搞定。一个标准的游戏工作室由工程师、美术、游戏设计师、制作人以及支持团队共同构成每个岗位环环相扣。1. 工程师引擎世界的建造者工程师群体内部也有清晰的划分简单可以分为运行时程序员和工具程序员。运行时程序员负责引擎内核与游戏逻辑深耕渲染、物理、AI、游戏玩法脚本等各个子模块工具程序员写各式各样离线工具服务美术与策划提升整个团队生产效率。同时岗位也有管理链路普通工程师→首席工程师编码 把控项目技术方向→技术总监 TD评估技术风险跟进行业新技术→CTO统筹整个工作室的技术路线。很多游戏公司还会区分「引擎程序员」和「游戏性程序员」。引擎程序员关心底层系统性能游戏性程序员更多聚焦玩家游玩逻辑。2. 艺术家内容为王撑起游戏的皮囊游戏圈流传一句话内容为王。所有我们眼睛看到、耳朵听到的一切全部来自美术团队。概念艺术家绘制原画定调美术风格3D 建模师分为前景角色、武器和环境建模师纹理师为模型赋予皮肤灯光师调配场景光影动画师赋予角色生命还有音效、作曲、配音演员共同构筑听觉体验。艺术总监把控全部产出保证千万份美术资产风格统一。3. 游戏设计师虚拟世界的规则制定者设计师负责定义玩家全部交互体验。有人负责宏观故事大纲有人作为关卡设计师摆放敌人、道具、谜题还有技术向设计师和程序员紧密协作落地玩法逻辑。游戏总监则保证整个游戏设计逻辑自洽。4. 制作人 发行生态制作人的职责在不同工作室差异巨大管控项目进度、充当业务和开发团队的桥梁甚至深度参与设计也有部分工作室例如顽皮狗没有专职制作人由资深全员分担管理工作。而发行商EA、索尼、任天堂等负责游戏市场宣发、生产分销。工作室分为独立外包工作室、发行商全资子公司还有第一方开发商例如顽皮狗直属于索尼只为自家主机开发游戏。️ 电子游戏本质一套软实时的代理模拟系统那么电子游戏到底是什么从计算机科学视角来看绝大多数 3D 电子游戏是一套软实时、交互式、基于代理的计算机模拟系统。✅基于代理游戏世界中角色、怪物、子弹、载具都是独立 “代理 Agent”各自拥有状态、行为互相交互。这也是为什么游戏开发大量使用面向对象编程。// C伪代码游戏代理游戏对象的基础抽象classGameAgent{public:// 每一帧更新代理状态 deltaTime为帧间隔时间virtualvoidupdate(floatdeltaTime)0;virtualvoidrender()0;virtual~GameAgent()default;protected:Vector3 m_pos;// 位置Vector3 m_velocity;// 速度};✅时间性模拟整个世界状态随着时间持续变化同时要接收玩家不可预测的输入。✅软实时系统系统有严格的时间 deadline。例如游戏要维持 60 帧意味着每帧最多只能跑 16.6ms物理模拟可能 1 秒要迭代 120 次。重点区分软实时错过时限不会造成现实生命危险游戏掉帧硬实时系统航空电子、核反应堆超时会酿成事故游戏属于典型软实时。游戏世界的模拟有两种数学建模思路分析式闭式公式给定时间 t直接算出结果比如自由落体公式y ( t ) f r a c 12 g t 2 v 0 t y 0 y(t)frac12gt^2v_0ty_0y(t)frac12gt2v0​ty0​数值式迭代依靠当前时刻状态推算下一个时间步长的状态。现实游戏几乎全部使用数值迭代也就是大名鼎鼎的游戏循环 Game Loop。// C 简化版游戏主循环伪代码intmain(){initEngine();// 初始化引擎各个子系统while(!isGameExit()){floatdeltaTimegetDeltaTime();handlePlayerInput();// 处理玩家输入updateGameLogic(deltaTime);// 更新游戏逻辑、AIphysicsWorld-step(deltaTime);// 物理模拟步进renderSystem-drawScene();// 渲染画面audioSystem-tick();// 音频更新}shutdownEngine();return0;}每一轮循环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内存碎片classIGameAllocator{public:virtualvoid*allocate(size_t size,size_t align)0;virtualvoiddeallocate(void*ptr)0;};图形DirectX / OpenGL物理碰撞Havok、PhysX、Bullet动画中间件Granny、Euphoria 生物力学动画AI 导航中间件Kynapse3. 平台独立层封装操作系统、系统库之间的差异给上层引擎一套统一 API实现一套代码跑多平台。4. 核心系统 Core System引擎的工具箱断言调试、自定义内存分配器、高性能数学库向量、矩阵、四元数、字符串、随机数、性能统计。整个引擎所有模块都依赖这一层。5. 资源管理器统一管理海量游戏资产模型、贴图、动画、音效处理资源加载、卸载、压缩包读取。6. 渲染引擎渲染引擎本身又细分为多层低阶渲染器图形设备接口、材质着色器、光照、摄像机提交几何图元场景图 剔除优化BSP、八叉树、四叉树、PVS 潜在可见集。把摄像机看不见的物体提前剔除拯救性能视觉效果层粒子烟火、贴花弹孔、动态阴影、HDR、全屏后期特效前端 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 源文件格式复杂、体积庞大无法直接丢进游戏里跑。于是就有了资产调节管道。资产管线负责把原始美术资源导出、转换、压缩、分平台优化输出引擎可以快速读取的资源格式。网格、骨骼动画、音频、粒子资源都要经过这条流水线加工。除此之外引擎工具链还包含世界编辑器搭建游戏关卡例如 Source 的 Hammer 编辑器虚幻的 UnrealEd资源数据库保存资产元数据动画循环标记、压缩等级、资源唯一 ID多种多样工具架构方案 1工具完全独立运行方案 2工具与运行时引擎共享底层核心库方案 3工具嵌入运行引擎内部虚幻 UnrealEd。好处是可以游戏内实时编辑坏处引擎崩溃编辑器也跟着挂掉。如今越来越多团队使用网页端工具做任务管理、日志查看、本地化翻译。网页工具无需安装浏览器直接访问对外包协作非常友好但复杂 3D 可视化任务仍然离不开传统客户端 GUI。写在最后游戏引擎是软件工程领域的集大成者。它融合图形学、物理、动画、网络、内存管理同时还要服务工程师、美术、设计师不同角色。不存在完美的 “万能引擎”。每一处架构选择背后都是需求、性能、开发效率之间的权衡。看懂引擎分层理解引擎与游戏的边界理解工具管线和运行时同等重要才算真正跨过游戏引擎的第一道门槛。拓展思考如果你要从零设计一款小型 3D 引擎你会优先实现哪些模块哪些模块直接选用第三方中间件
返回列表