QUAKE 3源代码评测:架构(第1部分,共5部分)>>

由于我在下一个合同前一个星期,我决定完成我的“循环ID”。后末日,末日iPhone,Quake1,Quake2中,德军iPhone和毁灭战士我决定读最后一个代码库我还不审查:

idTech3的3D引擎,权力的Quake III和地震现场。

引擎主要是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    

当谈到一个巨大的代码库,我更喜欢使用XCode:SpotLight速度,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(特别gamecgameq3_ui虚拟机项目),则不是全部使用它们。一些项目永远不会使用(splinesui)。

一个表格最好总结什么项目对哪个模块做出贡献:

项目 类型 DEBUG构建 RELEASE构建 注释
botlib 静态库 botlib.lib botlib.lib AI
在CGame 动态的Libary / Bytecode cgamex86.dll -  
游戏 动态的Libary / Bytecode qagamex86.dll -  
q3_ui 动态的Libary / Bytecode uix86.dll -  
QUAKE3 可执行文件 quake3.exe quake3.exe  
渲染 静态库 renderer.lib renderer.lib 基于OpenGL的
样条曲线 静态库 Splines.lib Splines.lib 使用NOWHERE!
UI 动态的Libary / Bytecode uix86_new.dll - 用于Quake III Arena。

琐事: idTech3的工作题目是“三位一体”。由于idTech4被称为“Neo”,我认为它是从“Matrix”专营权...但是id软件在接受firingsquad.com的采访时指出,它以“达拉斯的三一河”命名:

    约翰:就研究而言,我有几件引擎的事情正在进行中。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.libgamecgameq3_ui)的交互如下:

两个重要的事情要理解设计:

  1. 每个单个输入(键盘,win32消息,鼠标,UDP套接字)都转换成一个event_t集中的事件队列(sysEvent_t eventQue[256])。这允许其他事情记录(记录)每个输入,以重新创建错误。1998年10月14日在约翰·卡马克的“计划”中详细讨论了这一设计决策。
  1. 客户端和服务器的显式拆分(我在John Carmack的Q&A中概述了):

        Fabien Sanglard:您认为如何总结idTech3的主要创新之外:- 机器人IA - 虚拟机:结合QuakeC可移植性和Quake2 dll速度。-  SMP&着色器渲染器。- 新的网络代码。约翰·卡马克:明确将网络划分为客户端演示端和服务器逻辑端,这是真的对要做的事。我们退出了在末日3和大部分愤怒,但我们正在迁移回去。所有的Tech3许可证持有者被迫做更多的工作,以分裂架构实现单人效应,但事实证明执法纪律确实有一个有价值的回报。
    • 服务器端负责维护游戏状态,确定客户需要什么,并通过网络传播。它是静态联系的,bot.lib因为它是一个单独的项目,因为它的“开始的大师”第275页提到的混乱的发展历史:

          更糟糕的是,游戏的一个基本要素 - 漫游器 - 失踪了。机器人是由电脑控制的字符。一个好的机器人会与动作和肉体相融合像机器人的额外的场景,以及与玩家的互动。对于Quake III,死亡只有游戏,机器人是单人游戏动作所必需的。它们是隐含的复杂因为它们不得不像人一样行事。卡马克决定第一次将创建这些机器人的工作委托给另一个机器人 程序员在公司。但他没有跟进。卡马克再次错了每个人都像自己一样自我激励和擅长。他错了当Graeme努力控制工作时,发现机器人完全无效。 他们根本不喜欢人类。他们的行为基本上就像机器人一样。工作人员开始恐慌。到1999年3月,他们有理由害怕。[..]最后,机器人已经被种植到荷兰知名的模具制造商,英国人带来了这个制造商 他们生活 (Fab的注释:这是Mr.Elusive:Jan Paul van Waveren)。
    • 客户端负责预测实体在哪里(延迟补偿)并呈现视图。它与renderer项目静态链接:一个单独的项目,允许Direct3D甚至软件渲染器被非常容易地插入。

代码

从代码的角度来看,这是一个部分展开的循环,用于说明客户端和服务器的事件生产和消耗:

    int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){Com_InitNET_Init而(1){//通用代码 IN_Frame()   //将Win32操纵杆和鼠标输入作为event_t添加到统一的事件队列中。{IN_JoyMove                                    IN_ActivateMouseIN_MouseMove}Com_Frame{//通用代码 Com_EventLoop     //将win32消息,UDP套接字和控制台命令的泵送到队列(sysEvent_t eventQue [256]) Cbuf_Execute//服务器代码SV_Frame{SV_BotFrame                                  //在bot.lib中跳转 VM_Call(gvm,GAME_RUN_FRAME,svs.time)     //在游戏虚拟机中跳转,执行游戏逻辑SV_CheckTimeoutsSV_SendClientMessages                        //向连接的客户端发送快照或增量快照} //通用代码Com_EventLoopCbuf_Execute//客户端代码CL_Frame{CL_SendCmd                                  //泵送事件队列并发送命令到服务器。SCR_UpdateScreenVM_Call(cgvm,CG_DRAW_ACTIVE_FRAME);   //发送消息到客户端虚拟机(做预测)。要么VM_Call(uivm,UI_DRAW_CONNECT_SCREEN); //如果菜单可见,则会将消息发送到UI虚拟机。S_Update                                    //更新声音缓冲区}}}}

这是一个完全展开的循环,我在挖掘源代码时使用了一个地图。

一个有趣的事情要注意到,这完全说明了虚拟机的重要性:没有任何地方可以看到RE_RenderScene:执行剔除和发出OpenGL命令的功能。相反,发生的是:

  1. Quake3.exe向客户端VM发送消息:CG_DRAW_ACTIVE_FRAME哪个表示需要刷新。
  2. 虚拟机执行一些实体剔除和预测,然后通过Quake3系统调用(CG_R_RENDERSCENE)调用OpenGL再现。
  3. Quake3.exe接收系统调用,实际调用RE_RenderScene
    OpenGL Quake3.exe客户端虚拟机-------- ---------- ----------------------| | || | || VM_Call(CG_DRAW_ACTIVE_FRAME)-----------------> CG_DrawActiveFrame| | CG_DrawActive| | trap_R_RenderScene| | 系统调用(CG_R_RENDERSCENE,fd)| RE_RenderScene <-------------------------------------- || | || <---------------------- | || | |

统计

这里有一些来自cloc的统计资料:

    -------------------------------------------------- ---------------------------------------------文件空白评论代码-------------------------------------------------- ---------------------------------------------cloc-1.56.exe代码共享559 48630 73501 233952cloc-1.56.exe lcc 116 2270 1513 28067cloc-1.56.exe q3asm q3map 44 4987 5565 22877cloc-1.56.exe q3radiant 206 11870 13113 54922-------------------------------------------------- ---------------------------------------------共计919 68293 95509 341994-------------------------------------------------- ---------------------------------------------

在饼图上,我们可以生动地看到这个比例是多么的不寻常,因为30%的代码库专门用于工具:


部分原因是因为idtech3具有ANSI C编译器:开源Little C Compiler(LCC)用于为虚拟机生成字节码。

内存分配

两个定制分配器在这里工作:

  • 区域分配器:负责运行时,小型和短期内存分配。
  • Hunk分配器:负责从pak文件(几何,地图,纹理,动画)的级别负载,大型和长期分配。

更美好的明天

有了这个代码审查,似乎我跑出了伟大的3D引擎源代码阅读。但是CG世界正在走很多伟大的事情。我特别期待着Occulus Rift VR工具包:

构建,编码和 理解测试台将会很有趣。它应该在7月下旬直到那时止:快乐的黑客!

QUAKE 3源代码评测:架构相关推荐

  1. doom3 源代码评测 1

    原文地址 http://fabiensanglard.net/doom3/ 2012年6月8日 DOOM3源代码评测:简介(第1部分,共6部分)>> 2011年11月23日,id软件保持传 ...

  2. Linux源代码组织架构

    Linux源代码组织架构 arch : 架构相关代码 block : 块存储设备代码,实际上也就是调度算法. crypto : 加密算法 Documentation : 文本文档 drivers : ...

  3. 抖音seo企业号开发在线客服关键系统上线.技术源代码mvc架构搭建

    技术源代码mvc架构搭建/抖音seo优化管理系统是开发的一款围绕抖音企业号智能接待的全链条闭环营销工具:智能接待客户在线触达,具体包括智能客服关键自动回复私信.自动唤醒粉丝.批量回复评论.建站.留资. ...

  4. 在线评测系统设计与实现

    资料说明 南 阳 理 工 学 院 本 科 毕 业 设 计(论文) 在线评测系统设计与实现 Design and Implementation of Online Judge System Nanyan ...

  5. 基于SSH的可扩展的程序代码源码Web在线评测系统

    文档+任务书+开题报告+可行性分析报告+项目源码 摘 要 程序语言课程是计算机相关专业的核心教学内容之一,要提高程序语言设计能力必须通过大量的实践练习与交流.在传统的学习过程中,往往通过人工方式对程序 ...

  6. 如何高效的阅读Hadoop源代码?Hadoop的源代码写的怎么样?

    个人谈谈阅读hadoop源代码的经验. 首先,不得不说,hadoop发展到现在这个阶段,代码已经变得非常庞大臃肿,如果你直接阅读最新版本的源代码,难度比较大,需要足够的耐心和时间,所以,如果你觉得认真 ...

  7. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

  8. 《2017 云计算评测报告》:带你了解 AWS、阿里云、腾讯云等八家云计算服务提供商的综合用户体验情况...

     报告电子版至听云官方博客下载:http://blog.tingyun.com/web/article/detail/1352 评测说明 评测目标:同一应用(网站)在不同云上的用户访问体验,以及对云资 ...

  9. 编好c语言网上自动评测,C语言程序自动评测系统的设计与实现

    摘要: 随着计算机技术的发展和提高,计算机辅助评价(CAA)已成为当前计算机教育应用的热点研究问题之一.已有的研究成果已能很好的解决客观题测评问题,而主观题的评测问题则仍处于发展阶段.C语言程序设计课 ...

最新文章

  1. LTE QCI分类 QoS
  2. java基础之面试篇四-单向链表和双向链表区别
  3. SEAM学习(一)-----安装运行example
  4. Java——将JSONP返回的结果转化为Java对象
  5. Kafka 输入行太长 命令语法不正确
  6. java web导入tomcat_记一次在服务器上导入javaweb 项目的经历---tomcat服务器-Go语言中文社区...
  7. linux下驱动程序数字签名,64位Windows操作系统为驱动程序添加测试数字签名
  8. 蒋小华老师-中高层管理专家-专职助理冰冰
  9. ASCLL码对照表02(可显示字符)
  10. Lua脚本语言——Lua脚本基础语法
  11. 【转】8段数码管引脚图,8段数码管动态显示详解
  12. Azkaban的安装
  13. python和r语言哪个简单_python与r语言哪个简单
  14. 在Ubuntu上安装Azure DevOps self-hosted agent
  15. 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定
  16. java线段的平移和旋转,几何变换(旋转、缩放、平移)
  17. sqlloader导出数据指定分隔符_来一份数据库全家桶~
  18. iis7.0介绍和完整版如何下载
  19. 《联盟-互联网时代的人才变革》读后感
  20. hibernate查询方式总结(四)之QBC,QBE查询

热门文章

  1. JUC源码分析16-集合-ConcurrentSkipListMap、ConcurrentSkipListSet
  2. 一行 Python 代码能实现什么丧心病狂的功能?
  3. c语言程序有且只有一个什么函数,一个c程序有且仅有一个什么函数
  4. 软件测试课程设计——智云云盘
  5. 【GCC】gcc警告选项汇总--编辑中|gcc编译选项
  6. python学习心得和体会
  7. Vue+Webpack打造todo应用(慕课学习笔记)
  8. git提交提示workspace.xml出现conflicted
  9. 直接耦合的互补输出级
  10. 百度编辑器调用135编辑器方法