今天浏览某个游戏引擎的介绍时,注意到这样的一句话:“例如,许多现代3D游戏都以 C++和汇编语言实现它的核心引擎。”很想谈谈如今程序开发中的汇编使用——现在各种高级语言百花齐放,汇编语言还有生存之地吗?
相当多的程序员的脑海里都有这样的一个概念:程序语言越接近底层,最终的程序效率越高。这句话正确与否不是本文的重点,不过看起来似乎的确如此——C语言程序的效率一般高于Java程序,但是却比不过汇编语言编写的程序。
其实我前面的文章讨论过这些,计算机程序运行效率和开发效率其实是一对矛盾。
使用汇编的 3D 游戏引擎
那么,“许多现代3D游戏”的核心引擎使用汇编语言开发的目的是什么呢?是为了更高的效率呢,还是仅仅为了解决其他程序语言无法解决的问题?
其实,考虑到汇编程序的开发周期过长,一般的游戏引擎,包括其他程序往往并不是一开始就使用汇编语言编写。“例如,许多现代3D游戏都以 C++和汇编语言实现它的核心引擎。”这样的一句话并不意味着他们的引擎使用了大量的汇编语言编写。
更常见更可能的开发方案是这样的:开发人员首先使用对程序员更友好的C++编写游戏,完成后分析它,找出瓶颈是什么,如果只能使用汇编解决,那就在接下来的优化中,使用汇编解决瓶颈。
当然了,开发人员可能相当有经验,事先就能分析出游戏开发的哪些部分会成为瓶颈,在开发阶段就使用汇编解决这些瓶颈。使用汇编的关键目的和以前一样:速度。
如今,对程序员友好的各种高级编程语言基本上覆盖了各个领域,即使是底层,也有C语言可以满足大部分开发需求。因此在项目里编写大量汇编代码是非常不可取的,这会极大的降低开发效率。不过,有时为了追求极致的效率,而编译器忽略了某些优化项,汇编就当仁不让了。
例如英特尔使用 SSE 指令优化游戏引擎时,他们更常使用的是 intrinsics,而不是内嵌汇编代码,纯汇编代码就更少了。但是开发人员会查看编译器输出的汇编代码,以确定到底要优化什么。
什么时候使用汇编?
我很久没有编写过纯汇编程序了,但是结合我的经验和看到的一些文章,我认为汇编语言仍然不能被完全丢弃,它至少适用于以下几个场景。
- 并非所有的编译器都能利用 CPU 优化和指令集(例如英特尔偶尔添加的新指令集),此时要编写极致效率的程序必须借助汇编语言,毕竟等待编译器更新就意味着失去先发的竞争优势。
- 与此同时,汇编更容易将实际的程序代码与已知的CPU体系结构和优化相匹配,例如关于获取机制,缓存等方面的知识。这对开发人员来说应该是透明的,但事实上不是,这就是编译器可以被优化的原因。
- 当然了,某些硬件级的访问只能通过汇编语言实现。
- 汇编语言能够编写出更可预测的程序。这是显然的,因为其他高级语言的编译器总是有可能“优化”程序员的代码,使得同一份代码可能会被编译为多种指令。
最后
本文更像是我有感而发的“杂谈”,很多人只要发现某个项目的描述包含“由汇编开发”的字眼时,就会认为这个项目很高大上,至少效率不会低。但其实现在编写纯汇编项目已经很少见了,不过,虽然汇编语言作为一门“低级”语言,越来越少人问津,但是在处理某些平均“瓶颈”时,又是不可替代的。
https://stackoverflow.com/questions/791533/why-do-you-program-in-assembly