发布时间:2026/7/17 22:45:12
QUAKE 3源代码评测:架构 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月下旬直到那时止快乐的技巧

相关新闻

2026/7/17 22:45:12

2026企业网盘怎么选?我的选型经历与真实体会

一、从个人工具到企业网盘:一个自然过渡2026年,远程办公和跨地域协作早已不是新鲜事,但团队内部文件流转的方式却依然值得反复审视。我身边不少初创团队起步时,习惯用各类免费个人网盘、微信传输或U盘拷贝来分享文件。起初确实方便…

2026/7/17 22:45:12

SpeechAnalyzer API性能对比:iOS语音识别技术迁移与优化实践

在语音识别技术快速迭代的今天,Apple最新推出的SpeechAnalyzer API在性能测试中展现出了令人瞩目的表现。作为长期从事iOS开发的工程师,我们在实际项目中对SpeechAnalyzer、Whisper系列以及Apple旧版SFSpeechRecognizer进行了全面的横向对比测试&#xf…

2026/7/17 22:45:12

转轴故障诊断与修复:从结构原理到工程实践

你肯定遇到过这样的场景:刚买的设备用了没几天,或者用了很久的电子产品,一不小心摔了一下,外壳没碎,屏幕没裂,但就是某个关节处松动了,开合角度不对劲,甚至完全无法正常使用。这时候…

2026/7/17 23:50:23

Spring AI与LangChain4j有什么区别?2026年Java AI项目选型指南

前言 Java开发者构建大模型应用时,最常见的两个框架是: Spring AI; LangChain4j。 两者都支持模型接入、流式输出、Prompt、Memory、RAG、Tool Calling和MCP,因此很多人会问: 它们是不是差不多?企业项目到底应该选哪个? 答案不是简单的“谁功能更多”,而要看: 项目是…

2026/7/17 23:50:23

JavaScript 中的原型与继承

一、从对象说起, 一切皆对象在 JS 中, 几乎所有的东西都是对象, 或者说最终都会指向某个对象. 比如: let arr [1, 2, 3];console.log(typeof arr); //"object"function foo() {}console.log(typeof foo); //"function" (但本质上也是对象) 简单的对象创建…

2026/7/17 23:50:23

免费解锁Wand游戏修改器高级功能的完整开源解决方案

免费解锁Wand游戏修改器高级功能的完整开源解决方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 还在为Wand(原WeMod)的…

2026/7/17 23:50:23

第七史诗智能自动化助手:彻底解放双手的终极游戏伴侣

第七史诗智能自动化助手:彻底解放双手的终极游戏伴侣 【免费下载链接】e7Helper 【Epic Seven Auto Bot】第七史诗多功能覆盖脚本(刷书签🍃,挂讨伐、后记、祭坛✌️,挂JJC等📛,多服务器支持📺&a…

2026/7/17 23:50:23

亚洲EMBA怎么选?2026民企老板择校性价比实测榜单

【客观测评声明】本文为独立财经测评内容,无硬性品牌营销导向,基于2026年亚洲主流EMBA项目公开数据,从民企实业经营视角,客观拆解各项目适配度、优势与短板,为企业创始人、高管提供理性择校参考,规避择校踩…

2026/7/17 5:59:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/17 1:21:45

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/17 7:39:19

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/17 0:04:23

BiSheng JDK-build性能调优:构建速度提升30%的优化策略

BiSheng JDK-build性能调优:构建速度提升30%的优化策略 【免费下载链接】bishengjdk-build BiSheng JDK build and test scripts - common across all releases/versions 项目地址: https://gitcode.com/openeuler/bishengjdk-build 前往项目官网免费下载&am…

2026/7/17 14:59:44

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…