65.9K
CodeProject 正在变化。 阅读更多。
Home

DirectX 和纯汇编语言: 实现不可能的任务 - 第 I 部分

starIconstarIconstarIconstarIconstarIcon

5.00/5 (22投票s)

2017年6月5日

CPOL

6分钟阅读

viewsIcon

35762

如何在汇编语言中创建完整的 DirectX 游戏

你说真的吗?

是的。

关于使用汇编语言创建大型应用程序(尤其是 DirectX 游戏)的赞成和反对的论调充斥着互联网。显然,其中 99.99% 的论调都是反对的——因为其他所有人都在反对。本系列文章无意加入这场争论,而是旨在解释如何做到这一点。假设你已经足够成熟,能够做出选择,并且想要为 Windows 创建一个纯汇编游戏。你可能已经很清楚为什么要承担这样的任务(主要是因为你的作品在很多方面都将超越现有的一切),而现实是,偏离“大家都在做的事情”并不会阻止你的努力。

我将提及最常见的论调:用汇编语言编写一个完整的游戏需要花费太长时间,以至于在你完成一半之前,你的胡子就会比 ZZ Top 乐队成员的还要长。这个论调深深地植入在所有重复它的人脑海里。实际上,声称这一点的人中,没有人真正坐下来用汇编语言创建过一个大型游戏,所以这个论调不攻自破。这完全是个神话。我一直发现用 ASM 编码比使用任何其他语言都快得多,因为它简洁、直接,而且完全没有类型转换的依赖(也就是说,它不会将开发者管得死死的)。

然而,你的努力有时会受到阻碍,主要是因为在线上几乎找不到你正在做的事情的支持。你不太可能找到汇编语言的源代码示例;你必须将它们从 C++ 或其他你喜欢的语言转换过来。此外,对你来说没有头文件。你必须自己构建,从 C++(或其他语言)的头文件中提取你需要的所有信息。这会很繁琐,尤其是在转换 DirectX 数据结构时。

说到这个,这项任务简直是噩梦。通过经验,我发现仅仅读出这些结构声明中的类型是不够的。什么时候 LONG 不是 LONG?在 DirectX 中,这种情况比比皆是!虽然我不记得确切的在线位置,但我曾就此发表过一篇帖子,提供了具体细节:同一数据类型在同一个结构中被编码为 64 位,而在另一个结构中却是 32 位。更糟的是,DirectX 喜欢将结构嵌套到荒谬的程度,手动解析所有这些信息需要耗费大量时间和耐心。如果你真的想为你的游戏设定性能记录,那就做好准备吧。

好消息是,每个结构只需要处理一次。当然,除非你习惯于拖延备份工作。

结构:从别人的到你的

我转换数据结构的方式是打开一个 C++ 应用程序,为数据结构中的每一个成员设置一个指针,然后在一个函数调用中使用该指针,这样有用的 C++ 编译器就不会因为成员未被使用而将其删除。当这一切完成后,我必须(在反汇编层面)逐步查看每一行代码,以查看实际被放入 CPU 寄存器的指针。这告诉我每个结构成员的实际大小。这很痛苦,我讨厌这样做。但别无选择。

不合时宜

总的来说,开发社区总是朝着抽象化方向发展。在这个过程中,编码总是变得越来越陷入仪式和管理之中。这被视为“进步”,而实际上应用程序变得更大,运行速度更慢,开发者的学习曲线不断增加,生产力也随之下降。如此循环往复。一层又一层毫无意义的管理是这里的常态。这就是我们都生活的现实。

汇编语言则非常非常不同。它极其直接。数据就是数据;没有类型转换。作为一名开发者,你可能知道何时想将一个值用作浮点数或整数,并且你可能会很快地对其摆脱完全压抑性的类型转换执念。一个字节就是字节,仅此而已。数据就是数据;你可以随意处理它。你拥有控制权。

制造商直销

无需类型转换即可直接访问数据的优势的一个好例子是翻转浮点值的符号。如果你使用的是 32 位实数(DirectX 在各个地方都使用它们,即使在 64 位模式下),你不必将值加载到寄存器,然后发出某个指令(或多个指令)来翻转符号,然后将值放回内存。相反,你可以简单地将其视为一个整数,然后翻转第 31 位(从 0 开始,位 0 到 31)。

                xor dword ptr Foo, 80000000h ;

现在浮点数的符号已经被反转了。

诸如此类的优势在汇编语言中随处可见。其中大多数优势只有在你自己的创造力开始发挥作用时才能显现出来,但它们会累积起来。只有通过亲身实践,通过大量使用汇编语言来创建大型应用程序,你才能开始对这项任务与使用任何其他语言进行比较有一个清晰、现代、准确的认识。你将不再只是鹦鹉学舌般地重复你被教导去相信的东西。你将亲身经历,去了解。这是极少数人拥有的区分。

被拒绝的废物

在继续深入细节之前,最后说明一点:使用汇编语言是你个人的事业。它会让你与开发社区格格不入,而且你不太可能因此找到一份工作——除非你有政治关系,能够进入从事政府情报或航空航天工作的公司;在那里,25,000 美元的安全许可是必须的。通过承担一个大型汇编语言应用程序项目,你将直接与每个招聘经理想要看到的东西相悖。这对你的职业生涯毫无帮助。要么你推出自己的产品,最终用户不在乎你是如何创建它的,要么你 somehow 获得了创建平台相关(即任何游戏机)应用程序的许可。所以,你要清楚自己将要面对什么,不要因为这件事而幻想一个不存在的未来。

是的,上面所写的一切都有例外,但成为这些例外之一的代价是什么?

第二部分将深入探讨实际游戏开发的开端:初始化你的显示窗口并设置 DirectX。准备迎接一个全新的领域。

 

© . All rights reserved.