我听说游戏开发者有时会用汇编代码替换部分内循环来提高性能。
这是一个简单的例子吗?
集会在哪里?只是内联w / c代码?
谢谢!
编辑:非常感谢代码示例。
答案 0 :(得分:7)
我不是游戏开发人员,但我几乎只写了汇编代码(我是图书馆作家)。通常这是出于性能原因,但我也是为了解决编译器错误,或者使用硬件功能,例如条件标志,实际上更容易在汇编中表达而不是在C中。
我通常在汇编中编写完整的函数,因此我倾向于编写.s文件,这些文件被汇编到目标文件中并链接到可执行文件或库中。只需将单个循环移动到汇编中的人经常在其C源中使用内联汇编,大多数编译器都会通过某种内在函数支持它。
“简单”的例子很少见,因为如果它很简单,那么编译器就可以做得很好而且不需要汇编。
答案 1 :(得分:4)
以下是汇编编码专业人员:
汇编代码可以利用处理器的独特指令以及各种专用硬件资源。另一方面,C代码是通用的,并且必须支持各种硬件平台。因此,C很难支持特定于平台的代码。
汇编程序员通常对应用程序非常熟悉,可以做出编译器无法做出的假设。
汇编程序员可以运用人类的创造力;编译器虽然可能是高级的,但它只是一个自动程序。
另一方面,这是汇编编码缺点:
汇编程序员必须处理耗时的机器级问题,例如寄存器分配和指令调度。使用C代码,编译器会处理这些问题。
汇编编码需要DSP架构及其指令集的专业知识,而C编码只需要了解C语言 - 这是相当常见的。
使用汇编代码,将应用程序从一个平台移植到另一个平台是非常困难和耗时的。对于C应用程序来说,移植相对容易。
来自here
答案 2 :(得分:2)
这是一个简单的(ish)示例 - Swap code for Watt-32。
在这种情况下,__asm
用于将汇编代码与C / C ++代码整合在一起,以提高性能。由于这是一种替代的跨平台网络堆栈,因此有许多方面将性能保持在关键位置非常重要。
答案 3 :(得分:2)
如果我是你,我不会为正常编程任务的汇编编码而烦恼。即使您可以在此处或那里保存CPU时钟周期,查看复杂应用程序的整体性能,效果也是可以忽略不计的。
答案 4 :(得分:1)
语法取决于您的编译器;我使用gcc,它支持几种不同的内联汇编程序代码的方法。
点击此链接以获取说明和示例:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s4
答案 5 :(得分:1)
在PC,Xbox 360或PS3的大多数现代游戏中,你会发现很少的内联汇编。现代优化编译器在指令调度和寄存器分配方面做得相当不错,因此编写内联汇编的性能增益很少值得付出努力。 Visual Studio中的64位代码甚至不支持内联汇编。
内联汇编对于访问编译器不会自动使用的硬件特定指令非常重要。使用现代编译器内部函数是访问硬件特定指令的首选方式。在游戏中,内部函数通常用于数学重码以访问硬件特定的向量数学指令(在PC上使用SSE或在Xbox 360 / PS3 PPU上使用VMX或在PS3 SPU上使用SPU指令集)。内在函数是特定于平台/编译器的扩展,看起来像常规的C / C ++函数,但直接映射到底层硬件上的单个指令。您可以在MSDN上的Visual Studio中查看x86和x64内在函数的文档。
在某些游戏中,你仍然可以找到一些在程序集中编写的性能关键代码,但通常整个函数都是用汇编编写的,而不是在C / C ++代码中使用内联汇编。我在过去5年左右的任何代码中都没有在任何PC / Xbox 360 / PS3游戏中看到任何内联汇编。
答案 6 :(得分:1)
Michael Abrash的经典图形编程黑皮书是迈克尔之前关于汇编语言和图形编程的着作的汇编(包括他在Dobb博士期刊中的“图形编程”专栏)。本书的重点主要是分析和代码测试,以及性能优化。它还探讨了Doom和Quake 3-D游戏背后的大部分技术,以及纹理映射,隐藏表面移除等三维图形问题。感谢迈克尔提供这本书。
答案 7 :(得分:1)
即使你使用像__asm这样的api来内联汇编代码,也会产生一些开销。 编译器将首先转储所有yr寄存器(或者您在内联代码中使用的寄存器,具体取决于编译器选择优化),然后内联代码,然后恢复这些寄存器。 我觉得如果没有内联汇编代码的重要优势,那应该是 考虑到可维护性,移植性,正确性,可读性和性能之间的权衡,避免了这种情况。