QUAKE 3源代码评测架构第1部分共5部分由于我在下一个合同翻译可能有误前一个星期我决定完成我的“循环ID”。DoomDoomiPhoneQuake1Quake2中德军iPhone和毁灭战士我决定读最后一个代码库我还不审查idTech3的3D引擎Quake III,quakelive引擎主要是idTech2的演变但有一些有趣的新奇。重点可归纳如下第2部分新的双核渲染器与基于物料的着色器构建在OpenGL固定管道上。第3部分基于快照的新的网络模型。第4部分新型虚拟机在引擎中扮演重要角色将Quake1 可移植性/安全性与 Quake2速度 此处翻译可能有误……相结合。第5部分机器人的新人工智能。我特别印象深刻虚拟机的系统 和 相关的工具链 总共占发布的 代码 的 30。在这种观点下idTech3是一个小型操作系统可以提供三个进程的系统调用。基于快照和内存自省的优雅网络系统。像往常一样我写了许多笔记我已经清理并合成了图纸。我希望能节省时间给一些人但也鼓励别人的代码成为更好的工程师。第一次联系由于最近ftp.idsoftware.com最近退役代码可以在id的GitHub帐户中找到 git clone https://github.com/id-Software/Quake-III-Arena.git当谈到一个巨大的 代码库我更喜欢使用 XCodeSpotLight速度Command-click 查找 定义和字符串 高亮使得 该工具 比 Visual Studio 更强大。但是打开Quake III项目表明代码腐烂 并不总是 关于代码还涉及到 这些工具XCode 4.0无法 打开 Quake III XCode 2.0项目。最后我在 Windows 8 上 使用 Visual Studio 2010 Professional安装Visual Studio 2010生产力电动工具后 工具集实际上很愉快。第一个引人注目的是Visual Studio工作区不是由一个项目组成的而是八个。如果构建是DEBUG或RELEASE特别game是cgame和q3_ui虚拟机项目则不是全部使用它们。一些项目永远不会使用splines和ui。一个表格最好总结什么项目对哪个模块做出贡献项目类型DEBUG构建RELEASE构建注释botlib静态库botlib.libbotlib.libAI在CGame动态的Libary / Bytecodecgamex86.dll-game动态的Libary / Bytecodeqagamex86.dll-q3_ui动态的Libary / Bytecodeuix86.dll-QUAKE3可执行文件quake3.exequake3.exerender静态库renderer.librenderer.lib基于OpenGL的splines样条曲线静态库Splines.libSplines.lib使用NOWHEREUI动态的Libary / Bytecodeuix86_new.dll-用于Quake III Arena。琐事idTech3的工作题目是“三位一体”。由于idTech4被称为“Neo”我认为它是从“Matrix”专营权...电影中 取得 灵感 但是id软件在接受firingsquad.com的采访时指出它以“达拉斯的三一河”命名约翰就研究而言我有几件引擎的事情正在进行中。FS那是三位一体呢我认为“三位一体”有点混乱。约翰我从来没有真的确定这是如何像所有人…………此处有待进一步考察原文和重新翻译 何时我开始使用新的渲染技术和一切 每个人都称之为“下一个引擎” 不用太在意 。迈克尔·阿布拉斯Michael Abrash建议 我们只是采取英特尔在一条河附近命名您的下一个项目 您。 我们在达拉斯拥有三一河地名所以就像“三位一体引擎”一样下一步。约翰就研究而言我有几件引擎的事情正在进行中。FS那是三位一体呢我认为“三位一体”有点混乱。约翰我从来没有真的确定这是如何像所有人一样混乱。震后此处翻译可能有误…… 何时 我开始使用新的渲染技术和一切每个人都称之为“下一个引擎” 不用太在意。迈克尔·阿布拉斯Michael Abrash建议 我们只是采取英特尔在一条河附近命名您的下一个项目 您。我们在达拉斯拥有三一河所以就像“三位一体引擎”一样下一步。编辑2012年7月7日Jeremiah Sypult在发表本文后联系了我他用“XCode 4.0”项目为“Quake3”Mac OS X构建“不动”。此处 可能有误……我已经进一步修复了你可以在github上得到它。您将需要Quake III Arenabaseq3而不是演示版并确保 使用参数set vm_game 0 set vm_cgame 0 set vm_ui 0以使用dylib虚拟机。打开/code/quake3.xcworkspace它建立在一个点击架构了解架构的一个方便的方法是首先将软件视为 接收输入左上箭头和生成输出底部箭头的 黑盒子然后查看输入如何以白盒方式与6个模块流向输出quake3.exerenderer.libbot.libgamecgame和q3_ui的交互如下两个重要的事情要理解设计每个单个输入键盘win32消息鼠标UDP套接字都转换成一个event_t集中的事件队列sysEvent_t eventQue[256]。这允许其他事情记录记录每个输入以重新创建错误。1998年10月14日在约翰·卡马克的“计划”中详细讨论了这一设计决策。客户端和服务器的显式拆分我在John Carmack的QA中概述了Fabien Sanglard您认为如何总结idTech3的主要创新之外 - 机器人IA - 虚拟机结合QuakeC可移植性和Quake2 dll速度。 - SMP着色器渲染器。 - 新的网络代码。约翰·卡马克明确将网络划分为客户端演示端和服务器逻辑端 这是真的对要做的事。 我们退出了在Doom3和大部分 Rage 但我们正在迁移回去。 所有的Tech3 许可证持有者被迫做更多的工作 以分析 架构实现单人效应 但事实证明 执法纪律确实有一个有价值的回报。Fabien Sanglard您认为如何总结idTech3的主要创新之外 - 机器人IA - 虚拟机结合QuakeC可移植性和Quake2 dll速度。 - SMP着色器渲染器。 - 新的网络代码。约翰·卡马克明确将网络划分为客户端演示端和服务器逻辑端这是真的对 要做的事。我们退出了在末日3和大部分愤怒但我们正在迁移回去。所有的Tech3 许可证持有者被迫做更多的工作以分裂架构实现单人效应但事实证明 执法纪律确实有一个有价值的回报。服务器端负责维护游戏状态确定客户需要什么并通过网络传播。它是静态联系的bot.lib因为它是一个单独的项目因为它的《doom启示录 》第275页提到的混乱的发展历史更糟糕的是游戏的一个基本要素 - 漫游器 - 失踪了。bot 机器人 是由电脑控制的字符。一个好的机器人会与动作和 模型 相融合像机器人的额外的场景以及与玩家的互动。对于Quake III终结 只有游戏机器人是单人游戏动作所必需的。它们是隐含的复杂因为它们 不得不像“游戏中玩家”一样行事。卡马克决定第一次将创建这些机器人的工作委托给另一个机器人程序员在公司。但他没有跟进。卡马克再次错了每个人都像自己一样自我激励和擅长。他错了当Graeme努力控制工作时发现机器人完全无效。他们根本不喜欢人类。他们的行为基本上就像机器人一样。工作人员开始恐慌。到1999年3月他们有理由害怕。[..]最后机器人已经被种植到荷兰知名的模具制造商英国人带来了这个制造商 他们生活Fab的注释这是Mr.ElusiveJan Paul van Waveren。客户端负责预测实体在哪里延迟补偿并呈现视图。它与renderer项目静态链接一个单独的项目允许Direct3D甚至软件渲染器被非常容易地插入。代码从代码的角度来看这是一个部分展开的循环用于说明客户端和服务器的事件生产和消耗int WinMainHINSTANCE hInstanceHINSTANCE hPrevInstanceLPSTR lpCmdLineint nCmdShow { Com_Init NET_Init 而1 { //通用代码 IN_Frame //将Win32操纵杆和鼠标输入作为event_t添加到统一的事件队列中。 { IN_JoyMove IN_ActivateMouse IN_MouseMove } Com_Frame { //通用代码 Com_EventLoop //将win32消息UDP套接字和控制台命令的泵送到队列sysEvent_t eventQue [256] Cbuf_Execute //服务器代码 SV_Frame { SV_BotFrame //在bot.lib中跳转 VM_CallgvmGAME_RUN_FRAMEsvs.time //在游戏虚拟机中跳转执行游戏逻辑 SV_CheckTimeouts SV_SendClientMessages //向连接的客户端发送快照或增量快照 } //通用代码 Com_EventLoop Cbuf_Execute //客户端代码 CL_Frame { CL_SendCmd //泵送事件队列并发送命令到服务器。 SCR_UpdateScreen VM_CallcgvmCG_DRAW_ACTIVE_FRAME; //发送消息到客户端虚拟机做预测。 要么 VM_CalluivmUI_DRAW_CONNECT_SCREEN; //如果菜单可见则会将消息发送到UI虚拟机。 S_Update //更新声音缓冲区 } } } }这是一个完全展开的循环我在挖掘源代码时使用了一个地图。一个有趣的事情要注意到这完全说明了虚拟机的重要性没有任何地方可以看到RE_RenderScene执行剔除和发出OpenGL命令的功能。相反发生的是Quake3.exe向 客户端VM 发送 消息CG_DRAW_ACTIVE_FRAME哪个表示需要刷新。虚拟机执行一些 实体剔除 和 预测然后通过Quake3系统调用CG_R_RENDERSCENE调用OpenGL再现。Quake3.exe接收系统调用实际调用RE_RenderScene。OpenGL Quake3.exe客户端虚拟机 -------- ---------- ---------------------- | | | | | | | VM_CallCG_DRAW_ACTIVE_FRAME----------------- CG_DrawActiveFrame | | CG_DrawActive | | trap_R_RenderScene | | 系统调用CG_R_RENDERSCENEfd | RE_RenderScene -------------------------------------- | | | | | ---------------------- | | | | |统计这里有一些来自cloc的统计资料-------------------------------------------------- --------------------------------------------- 文件空白评论代码 -------------------------------------------------- --------------------------------------------- cloc-1.56.exe代码共享559 48630 73501 233952 cloc-1.56.exe lcc 116 2270 1513 28067 cloc-1.56.exe q3asm q3map 44 4987 5565 22877 cloc-1.56.exe q3radiant 206 11870 13113 54922 -------------------------------------------------- --------------------------------------------- 共计919 68293 95509 341994 -------------------------------------------------- ---------------------------------------------在 饼图上我们可以生动地看到这个比例是多么 的不寻常因为30的代码库专门用于工具部分原因是 因为idtech3具有ANSI C编译器开源Little C CompilerLCC用于为虚拟机生成字节码。内存分配两个定制分配器在这里工作区域分配器负责运行时小型和短期内存分配。Hunk分配器负责从pak文件几何地图纹理动画的级别负载大型和长期分配。更美好的明天有了这个代码审查似乎我跑出了伟大的3D引擎源代码阅读。但是CG世界正在走很多伟大的事情。我特别期待着Occulus Rift VR工具包构建编码和 理解测试台将会很有趣。它应该在7月下旬直到那时止快乐的技巧