外部精选
软件工程
#开发者实时流id Software 公开 Doom 3 BFG 源代码,可用 VS2010 编译
来源标题:Doom 3 BFG source code review
id Software 已在 GitHub 发布 Doom 3 BFG 的源代码,开发者用 Visual Studio 2010 Express 按三个步骤即可编译运行。代码采用接近 C with Classes 的 C++ 子集,不用异常、智能指针和 Boost,大量使用 const 与指针。原文称若已安装 Direct3D SDK,完整项目可在一分钟内编译完成,仅有 5 个轻微警告。
Hacker News 最新klaussilveira2026/11/6 · 今天20 分钟阅读
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
git clone https://github.com/id-Software/DOOM-3-BFG 2. 打开 Visual Studio 2010 Express,按 F8 进行“生成”。 完成! 注意:如果安装了 Direct3D SDK,整个项目可在不到一分钟内编译完成,仅有 5 个最小警告。 只需三步即可开始用 Visual Studio 2010 Express 进行修改:
- 将调试命令参数更新为 Steam 资源位置。 +set fs_basepath "C:\Program Files\Steam\SteamApps\common\DOOM 3 BFG Edition" +set r_fullscreen 0
- 将启动项目设置为“Doom3BFG”。
- 按 F5。 C++ 子集: Doom 3 BFG 使用 C++ 编写,这种语言如此庞大,既能用来生成优秀的代码,也能制造出让你眼睛流血的可憎之物。 幸运的是,id Software 选定了一个接近“带类的 C”的 C++ 子集,读起来毫不费力: 不使用异常。 不使用引用(使用指针)。 极少使用模板。 到处使用 const。 类。 多态。 继承。 而且尽管大量使用多线程,源码并未采用智能指针或 Boost:真是让人松一口气(那些东西通常会让代码变得不可读)。 注释: 注释丰富且有用,因为它们通常用一句话描述函数中每个重要部分的下一个代码块做什么。以下是 ParallelJobList.cpp 中的一个例子: int idJobThread::Run() { threadJobListState_t threadJobListState[MAX_JOBLISTS]; int numJobLists = 0; int lastStalledJobList = -1; while ( !IsTerminating() ) { // 获取任何新的作业列表并将其添加到本地列表 if ( numJobLists // 如果优先级高,则尝试运行整个列表以减少开销 // 否则运行单个作业并重新评估下一个作业的优先级 bool singleJob = ( priority == JOBLIST_PRIORITY_HIGH ) ? false : jobs_prioritize.GetBool(); // 尝试从当前作业列表运行一个或多个作业 int result = threadJobListState[currentJobList].jobList->RunJobs( threadNum, threadJobListState[currentJobList], singleJob ); 总体而言,读者能立即理解算法的每个部分,我希望这能启发人们编写更好的代码:现代软件开发 不再是成为顶尖程序员的问题。而是成为团队合作者,通过以下方式赋能同事: 优雅的设计。 易于阅读且带有注释的代码来实现它。 Doom 3 BFG 在这两项指标上都排名很高。 Visual Studio 解决方案经过了清理: 旧 Doom 3 新 Doom 3 BFG 两个“Game”项目(一个用于 Doom III 经典版,另一个用于“复活”)已移除:Game 现在是一个统一项目。 cURL 已移除:Doom III 不再下载内容。 去掉了愚蠢的 DoomDLL 名称……那个名称实际上生成的是 DOOM3.EXE。 移除了过时的 Maya 工具,用于导出 md5 模型、动画和摄像机路径。 移除了提供内部 RTTI/内省的 TypeInfo。 Doom 3 BFG 解决方案中的项目摘要: 项目 生成 说明 Amplitude Amplitude.lib 用于 Doom Classic:调整 WAV 振幅的工具。 Doom3BFG Doom3BFG.exe Doom 3 BFG 引擎。 doomclassic doomclassic.lib 经过大量重构的 Doom1/2 游戏引擎。 external external.lib jpeg-6 和 zlib 源代码。 Game-d3xp Game-d3xp.lib 统一的 Game 库,包含原始 + 扩展 + 新关卡。注意它现在编译为静态库而非 DLL。 idLib idLib.lib id software 工具包,提供抽象文件系统、线程、容器。 timidity timidity.lib 用于 Doom Classic:将 MIDI 输入转换为 WAV 格式。 架构与原始 Doom III 显著不同:解决方案现在编译为一个 单体可执行文件(Doom III 编译为一个可执行文件 和一个包含游戏逻辑的 DLL)。 这出于两个原因(根据主要开发者 Brian Harris 的说法): PS3/Xbox360 等主机对 dll 的支持不太好。 加速开发。使用 dll 时,你必须非常小心内存——你不能在一个中分配而在另一个中释放。这使事情变得更加困难,并产生非常难以追踪的 bug。 针对 PC 之外的 Xbox 360 和 PS3 带来了许多重要更新: 如前所述,整个游戏包含在一个可执行文件中。 游戏过去将资源存储在多个 PAK 文件(即 zip 归档)中。DVD 读取器的高延迟促使 id Software 使用“资源系统”:一个关卡的所有资源存储在一个文件中,一次性批量加载。 Doom3 资源过去全部基于文本(参考)。为了降低加载时间,某些资源(如模型和动画)现在是二进制格式(.bmd5mesh 和 .bmd5anim)。 Doom3 设计为在 640x480、4:3 宽高比下运行。由于电视和显示器现在是 16:9,所有菜单都已重做。可能是为了加速开发, 它们用 Adobe Flash 实现。Doom3 BFG 运行自己的 Flash 解释器(/neo/swf/ 文件夹)。再次使用 Flash 是为了加速开发。 渲染器着色器已使用 GLSL 1.5 重写。HLSL 着色器可以即时转换。 为了获得可接受的帧率,“手电筒”在 PC 上无法与武器同时使用。现在在 Doom 3 BFG 中它可以被胶带粘在武器上,但出于性能 原因它不会投射任何阴影。 由于所有菜单都是跨平台的,PC 失去了许多渲染器设置:我们得到一个同时满足 PC 和主机的简单版本。 新引擎和旧引擎体现了过去 10 年发生的范式转变: “免费午餐”已经结束,游戏引擎必须考虑多线程设计,以充分利用多核机器。 因此,Doom III BFG 中最吸引人的是 idTech5 线程架构。详细评审可在专门页面找到。 渲染器已更新:两个主要变化是: 它运行在 Open GL 3.2 兼容配置文件上,使用 GLSL 1.5 着色器。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。