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月下旬直到那时止快乐的技巧

相关新闻

Microsoft Edge 每次启动都出现“用户配置 1”?删除后仍自动创建的解决办法

Microsoft Edge 每次启动都出现“用户配置 1”?删除后仍自动创建的解决办法

不少人在 Microsoft Edge 中设置了多个浏览器配置文件后,会遇到这样的情况: 每次打开 Edge,右上角都会弹出配置文件或账号选择页面。即使已经把不需要的“用户配置 1”删除,下次启动浏览器时,它仍然会被自动创建。自己…

2026/10/17 14:08:33 阅读更多 →
基于N32 MCU的OLED温湿度监测系统设计与优化

基于N32 MCU的OLED温湿度监测系统设计与优化

1. 项目背景与核心需求在工业物联网和智能家居领域,温湿度监测是最基础的环境感知能力。去年参与某农业大棚项目时,我们最初采用分离式温湿度传感器LCD屏的方案,但遇到两个痛点:一是LCD在强光环境下可视性差,二是布线复…

2026/10/18 4:27:29 阅读更多 →
手机全景摄影:低成本实现720度建筑与街景记录

手机全景摄影:低成本实现720度建筑与街景记录

1. 项目概述:720度全景摄影的平民化实践去年帮朋友房产中介拍摄房源时,我第一次用手机配合全景云台完成了整套房屋的720度展示。那种让客户在手机上滑动屏幕就能"走进"房间的体验,彻底改变了传统看房模式。这次经历让我开始思考&am…

2026/10/18 4:28:47 阅读更多 →

最新新闻

Gowater:统一水务物联网设备接入与数据处理的Go框架

Gowater:统一水务物联网设备接入与数据处理的Go框架

1. 水务传感器的数据接入困局:为什么需要一套“水”专用框架1.1 设备协议四分五裂:从RS485到4G DTU的真实改造现场在讲Gowater之前,我想先还原一下我最早参与智慧水务项目时的场景。某区县的水务集团下辖三个水厂、十几个泵站,加上…

2026/10/19 8:00:33 阅读更多 →
Pycharm远程开发实战:Deployment+Remote Interpreter配置指南

Pycharm远程开发实战:Deployment+Remote Interpreter配置指南

1. 项目概述:这不是远程桌面,而是开发者真正的“第二工作台”“利用Pycharm连接服务器”——这八个字背后藏着的,不是简单的图形界面跳转,而是一整套现代Python开发工作流的底层重构逻辑。我第一次在某高校实验室带学生做分布式数…

2026/10/19 8:00:33 阅读更多 →
FastDriveVLA:大模型减重四板斧,自动驾驶端到端提速7.5倍

FastDriveVLA:大模型减重四板斧,自动驾驶端到端提速7.5倍

第一次看到FastDriveVLA这个项目,我脑海里冒出来的第一句话是:大模型也有能“减肥成功”的一天。在自动驾驶AI这个圈子里,视觉-语言-动作(VLA)模型一直是高不可攀的“大家伙”,动不动就上亿、甚至几十亿参数…

2026/10/19 8:00:33 阅读更多 →
eCharts地图资源:344个县区GeoJSON与两种加载方式详解

eCharts地图资源:344个县区GeoJSON与两种加载方式详解

简介:面向需要在中国县级行政区划层面做数据可视化的前端开发者,这份eCharts地图资源提供了全国344个县区的可复用地图数据,并内置两种接入方式演示:直接使用预置地理数据集,以及加载外部JSON自定义地图。压缩包共391个…

2026/10/19 8:00:33 阅读更多 →
narrator-ai-cli:一句话生成影视解说视频的自动化实践

narrator-ai-cli:一句话生成影视解说视频的自动化实践

做影视解说做了三年多,我一直在跟剪辑软件、配音工具、文案平台打交道。说实话,一套视频做下来,最耗时间的根本不是剪辑本身,而是文案打磨、配音录制、字幕对齐这些细碎活。前阵子朋友给我推荐了一个命令行工具,名字叫…

2026/10/19 8:00:33 阅读更多 →
基础模型重塑广告竞价环境建模:Bid2X 解读

基础模型重塑广告竞价环境建模:Bid2X 解读

广告竞价这个领域,真正难的不是“怎么出价”,而是“出价之后到底会发生什么”。KDD25 这篇 Bid2X,标题里最抓人的就是“环境建模”这四个字——它把视角从策略本身拉远到了策略所处的整个动态拍卖市场。基础模型视角的引入,让环境…

2026/10/19 7:59:32 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →