1.毁灭战士3秘籍
2.毁灭战士引擎简介
3.毁灭战士引擎毁灭战士关卡结构
4.毁灭战士基本信息
5.在《毁灭战士》中应用二叉空间分割(BSP)是毁灭毁灭何等天才之举? | Linux 中国
毁灭战士3秘籍
假如你在网上搜最好的C++源代码。「毁灭战士3 | Doom 3」的战士战士源代码肯定会被提到好多次,这篇文章就来证明为何如何说。引擎源码引擎源码用
我花了一些时间通读了 DOOM3 的毁灭毁灭源代码。这可能是战士战士我见过的最干净最漂亮的代码了。DOOM3是引擎源码引擎源码用grpc源码详解由id Software公司开发、Activision发行的毁灭毁灭视频游戏。该游戏为id Software赢得了商业上的战士战士成功,已售出万多份拷贝。引擎源码引擎源码用
在年月日,毁灭毁灭id Software维持开源传统,战士战士发布了他们上一个引擎的引擎源码引擎源码用源代码。这份源代码已经被很多开发者审查,毁灭毁灭这里就有个fabien反馈的战士战士例子(链接):
DOOM3 BFG是用C++写的,一种庞大的引擎源码引擎源码用语言,它既能写出优秀的代码,但也让人憎恶到眼睛流血。幸运的是,id Software退而求其次,使用C++子集,接近于“带类的C”,如以下几条规则:
没有异常没有引用(使用指针)少用模板使用常量(Const everywhere)类多态继承
很多C++专家不建议使用“带类的C”这样的方法。然而,DOOM3从开发至,没有使用任何现代C++机制。
让我们使用 CppDepend 来看看源代码,攻击泼公式源码探索它的特别之处
DOOM3由少量的几个工程组成,这儿有它的工程列表和一些类型统计。
以及它们之间的依赖关系图:
DOOM3定义了很多全局函数。但是,大部分内容实现是在类中。
数据模型使用结构体定义。为了在源代码中对结构体的使用有个更具体的理解,在下图中将它们以蓝色分块显示出来。
在图表中,代码被表示为树形图,树形图表示法能使用嵌套的矩形来表示树状结构。而树结构用来表示代码分层结构。
工程包含命名空间。命名空间包含类型。类型包含函数和域(field)。
我们可以观察到它定义了许多的结构体,比如DoomDLL %的类型都是结构体。它们被有条理地用来定义数据模型。该实践已经被很多工程所接受,这种方法有个最大的缺点是多线程应用,结构体的public变量并非不可改变的。
为何支持不可变对象,有个重要原因:能显著地简化并发编程。考虑下,写个合格的域名查网站源码多线程程序是个艰巨的任务吗?因为很难同步线程访问资源(对象或者其他OS资源)。为什么同步这些操作很困难呢?因为很难保证在资源竞争状态下多线程对多个对象进行正确的读写操作。假如没有写操作呢?换句话说,线程只访问这些对象,而不做任何变动?这样就不再需要同步操作了!
让我搜索下只有一个基类的类:
几乎%的结构体和类都只有一个基类。通常,OOP(面对对象编程)使用继承的好处之一是多态,下面蓝色标明了源代码中的虚函数:
超过%的函数是虚函数,少数是纯虚函数,下面是所有虚基类列表:
只有个类被定义为虚基类,其中个类只是纯接口,也就是这些接口都是纯虚函数。
我们来搜搜使用了RTTI的函数
只有非常少的函数使用了RTTI。
为保证只使用OOP最基础的概念,不使用高级设计模式,不过度使用接口和虚基类,限制了RTTI的使用并且数据都定义为结构体。
至此这份代码跟很多C++开发者所批评的“带类的C”没太大区别。
开发者的一些有趣的选择,帮助我们理解它的奥秘:
1-为有用的服务提供公用的基础类。
许多类是从idClass继承下来的:
idClass提供如下服务:
2-方便的字符串操作
一般来说,字符串是一个项目里用的最多的对象,许多地方需要使用它,并且需要函数来对其进行操作。
DOOM3定义了idstr类,众筹认购源码几乎包含了所有用的字符串操作函数,无需再自己定义函数来接受其它框架所提供的字符串类。
3-源代码与GUI框架(MFC)高度解耦
很多工程用了MFC后,它的代码就会与MFC类型高度耦合,并且在代码的任何一处都能发现MFC类型。
在DOOM3里,代码和MFC是高度解耦的,只有GUI类才会直接依赖它。下面的CQLinq查询可以展示这点:
这样的选择对生产力有很大的影响。事实上,只有GUI开发者才会关心MFC框架,其它开发者不应该被强制在MFC上浪费时间。
4-提供了非常好的公共函数库(idlib)
几乎在所有项目中都会用到公共工具类,就如以下查询的结果:
正如我们所看到经常使用的就是公共工具类。假如C++开发者不使用一个良好的公共工具框架,那就会为解决技术层面问题花费大部分的开发时间。
idlib提供了很多有用的类用于字符串处理,容器和内存。有效促进了开发者的工作,并且能让他们更多的关注在游戏逻辑上。
5-实现非常易于理解
DOOM3实现了非常难的编译器,对于C++开发者而言,开发语法解析器和编译器不是件轻松的事。尽管如此,DOOM3的云之道2.6源码实现非常容易被理解并且编写得十分干净。
这儿有这些编译器的类的依赖图:
这儿还有编译器源代码的代码片段:
我们也看过许多语法解析器和编译器的代码,但这是第一次我们发现编译器是如此得容易理解,和整个DOOM3源代码一样。这太神奇了。当我们探究DOOM3源代码时,我们忍不住会喊:喔,这太漂亮了!
总结
即使DOOM3选择了很基础的设计,但它的设计者所做的决定都是为了开发者能更多的关注游戏逻辑本身,并且为所有技术层面的东西提供便利。这提高了多大的生产力啊。
无论何时使用“带类的C”,你应该明白你自己在干什么。你必须像DOOM3的开发专家一样。但不推荐初学者忽视现代C++建议而冒险。
毁灭战士引擎简介
毁灭战士引擎,一款由id Software开发的游戏引擎,其最初的版本用于创造毁灭战士I和II,同时也为HeXen、Heretic等游戏提供技术支持。这款引擎由约翰·卡马克创造,并得到麦克·亚伯拉什、约翰·罗梅洛、戴夫·泰勒和保罗·莱德克的辅助创意。最初的开发工作在NeXT电脑上完成,且支持DOS系统。
年,Linux版本的源代码被公开,仅限于非商业用途。id公司于年在GPL准则下重新发布源代码,进而引发了不同版本的毁灭战士游戏诞生。这些版本能够适应多种平台,同时增加了许多特性。
尽管毁灭战士引擎并非真正意义上的三维引擎(玩家无法向上或向下查看),但它却是首个有活力的仿三维引擎。在当时,这款引擎引领了一场游戏界的革命,通过其独创的材质贴图技术,为三维环境带来了生机。
毁灭战士引擎毁灭战士关卡结构
毁灭战士引擎和其关卡结构的探讨,深入解析了游戏地图的构建原理。
在游戏设计中,毁灭战士的地图布局遵循平面化原则,这意味着所有的关卡都呈现为二维平面,避免了“房间之上的房间”这样的复杂设计。这一设计策略的优点在于,它能清晰地展现出地图的模式,便于开发者精确标注墙面和玩家的位置,如同示意图所示。
构成游戏地图的基本单位是点(Vertex),这些点通过连线形成线,进一步组合成为不同的几何形状,即区块。每个区块具有独特的属性,如地板和天花板的高度、亮度等级以及地板与墙面的材质贴图等。通过创建多个区块,可以实现对不同区域光照的精细控制。
在区块的构建中,边界扮演了关键角色,它用于存储墙面的贴图信息,包括地板和天花板的贴图。每个边界可以配备三种材质:中、高和低,以适应不同高度的墙面需求。在只有一个边的区块墙面上,仅中材质生效;而高低材质则用于填补不同高度之间留下的缝隙。
除了区块和边界,游戏地图中还存在种类繁多的“物品”,它们通过二维示意图进行展示,并根据类型自动定位在天花板或地面上。这些物品包括玩家角色、怪物、增强物体等,为游戏世界增添了丰富性和互动性。
综上所述,毁灭战士的关卡设计在平面化的基础上,通过区块、边界和物品等元素的巧妙组合,构建出一个既充满挑战又易于理解和操作的游戏世界。这一结构不仅体现了游戏设计的创新性,也为玩家提供了沉浸式的体验。尽管这里只对关卡结构进行了大致的介绍,但可以预见,其内部细节和可能性远不止于此,值得深入研究和探索。
毁灭战士基本信息
毁灭战士是一款由id Software开发并发行的FPS游戏,发布于年月日,主要运行于PC平台。该游戏引擎为毁灭战士引擎,支持单人、多人(合作)及多人(死亡模式)模式。《毁灭战士》游戏的中文名与外文名相同,为"Doom"。其游戏平台为MS-DOS系统,存储介质为3 1/2英寸软盘或CD。根据ESRB分级,游戏为Mature(适合岁以上玩家)和Teen(适合岁以上玩家),Game Boy Advance版本则为级。《毁灭战士》的游戏截图和壁纸共张和3张,充分展示了游戏的风格和特色。扩展资料
毁灭战士(Doom)是id Software在年月8号在DOS系统下,推出的一款第一人称射击游戏。这个系列的核人制做者是约翰·卡马克和约翰·罗梅洛(John Romero)。一款由Andrzej Bartkowiak指导的毁灭战士**已于年推出。在《毁灭战士》中应用二叉空间分割(BSP)是何等天才之举? | Linux 中国
在电子游戏开发领域,卡马克将学术前沿研究应用于《毁灭战士》中,运用二叉空间分割(BSP)技术,将游戏引擎的运行速度提升到了一个新高度。这一做法在电子游戏行业中,尤其是在对动感和速度有着高要求的射击游戏中,是极为显著的天才之举。卡马克在面临《毁灭战士》关卡渲染速度问题时,通过阅读相关论文,将二叉空间分割技术引入,解决了一直困扰游戏渲染性能的“可见面检测”(VSD)问题。
二叉空间分割技术最初源于军事研究领域,用于解决军事模拟中的可见性问题,随后被引入到计算机图形学领域。在卡马克应用到《毁灭战士》之前,已有相关理论研究,包括美国空军和NASA在世纪年代的早期研究,以及年福克斯、凯德姆和内勒提出的具体算法。这些研究为二叉空间分割技术的发展奠定了基础,尽管技术本身不是由卡马克原创,但他的创新在于将这一技术应用于实时电子游戏中,成功地提升了游戏引擎的渲染性能。
在《毁灭战士》中,卡马克通过构建BSP树,解决了关卡几何图形的渲染顺序问题,使得游戏在配置较低的个人电脑上也能流畅运行。这一技术的应用不仅解决了游戏的性能瓶颈,还为《毁灭战士》的渲染器提供了高效、灵活的解决方案。卡马克的这一做法不仅体现了他对技术的深刻理解和应用能力,同时也展示了在电子游戏开发中的创新精神。因此,将二叉空间分割技术引入《毁灭战士》,无疑是一个天才之举,不仅解决了特定技术难题,还为电子游戏的开发开辟了新的路径。