平均而言,现代游戏代码中多久使用一次汇编?
特别是在已经具有良好C ++编译器的平台(例如x86,PPC或ARM)上,因为我认为嵌入式系统上的游戏会大量使用汇编语言。
平均而言,现代游戏代码中多久使用一次汇编?
特别是在已经具有良好C ++编译器的平台(例如x86,PPC或ARM)上,因为我认为嵌入式系统上的游戏会大量使用汇编语言。
Answers:
答案取决于您所说的“游戏”和“二手”的含义。我假设“使用”的意思是“在特定游戏项目的过程中编写的”。
根据我的经验和与我交谈过的人的轶事数据:
汇编语言知识在游戏行业中并不适用,但是取决于您制作的游戏类型,它可能会有所优势。
曾经有一个论点认为,与人工编写汇编程序相比,编译器在优化C代码方面做得更好。通常这是正确的,有时是错误的。但是,如今,不断增加的CPU复杂性和扩展“扩展”(即分离处理器)的需求相结合,意味着优化工作通常花费在其他地方。
近年来,我唯一一次在游戏代码中看到汇编__asm int 3
语言是强制设置断点的语句,而我个人唯一的汇编语言用途是查看功能的反汇编以诊断异常的崩溃错误。
现代控制台游戏中的大量高性能代码是使用汇编和C ++之间的某种中间立场编写的:编译器内在函数。这些构造看起来和解析都像C ++函数,但实际上被翻译成单机器指令。因此,例如,我的“将向量V的每个值钳位为> = a和<= b”的函数看起来像
// for each v.x, ensure v.x >= a.x && v.x <= b.x
inline __m128 ClampSIMD( const __m128 &v, const __m128 & a, const __m128 & b )
{
return _mm_max_ps( a, _mm_min_ps( v, b ) );
}
在这样的函数中,我仍在考虑特定的机器指令,但是我很方便用C编写它们,因此我不必担心寄存器着色和调度以及加载操作和其他无聊的细节。
您仍然需要知道CPU支持的指令,特别是因为与聪明人的工作能力相比,现代编译器在矢量化代码方面很糟糕。有时,关于如何安排代码的细微细节可能会对性能产生巨大影响,而如果不了解机器的运行情况,这些影响就不会很明显。
尽管我们可能没有在汇编中编写代码,但仍然在汇编中进行了大量调试。优化编译器会以调试器无法跟上的方式积极地重组代码,因此通常在调试“发布模式”时,最好的方法是弹出反汇编程序并以这种方式跟踪代码。GDC关于崩溃的“取证调试”的演讲说明了在该级别进行调试的许多原因和方式。
过去需要手动卷装的问题越来越少。您“可能”获得的速度会增加可读性和调试能力。还应该仅将其作为代码部分的最后优化步骤之一,因为在大多数情况下,汇编并不能解决速度问题。如今,CPU的速度越来越快,而内存速度却没有,通常,控制数据流过CPU的方式比其他任何方式都更为重要。
对于现代编译器,他们还发现很难对汇编代码进行优化,因为它们必须处理您所碰到的所有寄存器,而且通常无法在手工编写的代码中对指令进行重新排序。为了减少对汇编的需求,现在还提供了一些内在函数,这些内在函数有助于访问低级概念,但是这种方式对编译器友好,并允许它们与您一起工作而不是反对。
随着中说,在PS3的SPU是一个人们仍然有作为解释使用汇编来获得最大的处理器,具有手动指令流水线例如面积这里。