让DOOM3提速40%
网上帖子透露惊天秘密 Doom3中A卡能够提速40%
可能已经有读者在网上看到了关于ATI卡在Doom3中通过调整参数来获得40%性能提升的消息。
这个号称能让A卡在Doom3中提速40%的方法需要修改Doom3 pak000.pk4压缩包当中的渲染文件,具体步骤如下:
1、用WinRAR打开Doom3 pak000.pk4压缩包,在WinRAR文件浏览框当中找到interaction.vfp文件,用记事本打开interaction.vfp文件;
2、在interaction.vfp当中找到以下代码:
PARAM subOne = { -1, -1, -1, -1 };
PARAM scaleTwo = { 2, 2, 2, 2 };
在这段代码下面加上PARAM specExp = { 16, 0, 0, 0 }; ,现在这段代码应该是:
PARAM subOne = { -1, -1, -1, -1 };
PARAM scaleTwo = { 2, 2, 2, 2 };
PARAM specExp = { 16, 0, 0, 0 };
3、将以下代码:
# perform a dependent table read for the specular falloff
TEX R1, specular, texture[6], 2D;
修改为:
# perform a dependent table read for the specular falloff
# TEX R1, specular, texture[6], 2D;
POW R1, specular.x, specExp.x;
4、保存interaction.vfp文件,WinRAR会询问是否更新Doom3 pak000.pk4压缩包当中的文件,选择“是”。至此修改完成。
根据Humus自己测试,在1280×1024分辨率下,修改前的fps是34fps,修改之后的fps是48fps。
笔者看到这个消息以后也非常震惊,随即联系了“龙之队”的3D程序设计师刘宏春同学,他为我们作出了详尽的解释……
3D高手解释性能提升个中缘由
首先,关于发帖的这个人,网名Humus,他本身就是ATI的员工,是“work for ati”的,他的发言是属实的。
其次,对于为什么修改参数以后能够提升帧速率,我们先要看看改的这两句的内容是什么意思:
一开始在
PARAM subOne = { -1, -1, -1, -1 };
PARAM scaleTwo = { 2, 2, 2, 2 };之后添加的PARAM specExp = { 16, 0, 0, 0 };本身的意义仅仅是定义了一个四维的向量,这个向量的值就是一个常数向量,其具体值是在第一坐标轴上的长度为16的值。后来的在
# perform a dependent table read for the specular falloff
TEX R1, specular, texture[6], 2D;上的修改才是最最关键的。
我们可以从第一句注释中看到,下面的这句TEX R1, specular, texture[6], 2D;的作用就是从一个表中读取一个值来决定一个高光的范围,而这个表的存在形式则是一个由幂值组成的贴图。
现在采用的方法是将TEX R1, specular, texture[6], 2D;这句话注掉,并且替换上POW R1, specular.x, specExp.x;
这两句话中第一句TEX R1, specular, texture[6], 2D;的意义是读取一个贴图,并且赋值到R1寄存器(TEX命令便是读取贴图的意思)。
现在,我们将这句话注释掉,然后取代以POW R1, specular.x, specExp.x; 这句话的意思就是计算specular.x的幂,而用前面我们定义的向量specExp.x作为幂的指数。
这样做有什么作用呢?答案是采用了这种方法以后,显卡将利用GPU来计算用来表示高光范围的这个幂,而不再使用读取贴图查找值的方法了。
这样做的好处就是能够充分发挥GPU的功效,让GPU来承担更多的计算的操作——这也就是能够提升性能的原因了。
DOOM3让显卡去查《数学用表》?
可能有的朋友看了还不是太明白,我们可以这样简单地理解:
如果在82年之前出生的朋友一定还记得小时候很少有计算器,所以初中的数学课上用来计算高次幂以及开方运算的时候给每个学生发了一本《中学数学用表》……随着科技的进步,计算器的应用日渐普及,现在初中数学课堂上已经全部换成计算器了。
这和我们今天在Doom3里遇到的情况就非常类似。在游戏设计之初,当时Q3开发刚刚结束,那时候的显示芯片无论性能还是功能在今天看来都还都非常薄弱,所以卡马克就给每个“学生(也就是各种图形芯片)”发了一本《数学用表》,也就是一个存储着幂值的矩阵,而这个矩阵正是以贴图的形式存在的。
卡马克采用这种方法的主要的目的是保证游戏对各种显卡的兼容性,因为所有的显示芯片都能够在贴图中寻找数据。
但是,随着图形技术的飞速发展,显示芯片的运算能力有了几何级数的增长,但Doom3还强迫显卡在矩阵贴图中寻找幂值——这种情形就好比现在的初中生都人手一个计算器了,但是每个人还都必须拿着卡马克准备好的《数学用表》来翻查数据一样。
而ATI这次的作法就相当于扔掉《数学用表》,拿起了计算器来算幂值一样。
那么为什么ATI采用这种方法能够提升性能呢?说起来,这和ATI芯片本身的“先天不足”还有很大关系呢。
在分析这个“先天不足”之前我们先要解释一下贴图缓冲的问题。贴图缓冲比较类似于处理器的Cache,就像是我们会在《数学用表》中最常用的页码上折个角或夹个书签,这样需要再次用到这页的时候就能比较快的查找到相应的数值了。
ATI芯片的“先天不足”就是贴图缓冲会经常性的失效,这就会导致GPU只能再次去查找显存甚至系统内存中的幂值贴图了——结果如何你也一定知道了,就是整体效率的降低。
通过以上原理分析我们不难看出,采用GPU直接计算幂值的确能够提高速度,但是提高的幅度完全取决于场景中的具体情况,所以Humus说的40%的性能提升基本上只会在极限状态下出现,真实的情况应当是采用这种方法以后帧速率能够有“小幅度”的提升。
至于有人跟帖说采用这种方法会导致图像质量大幅降低的说法,目前已经得到了发帖人自己的解释——这位网友在修改文件的时候查找错了位置,将MUL R1, R1, program.env[1];注释掉了。
事实上,从理论的角度来看,ATI的这种方法反而有助于提升图像的质量——就像用计算器计算出的幂值要比查找《数学用表》得到的结果精确度更高一样。
实际测试:性能确有提高,幅度真的不大
——“没有调查,就没有发言权”
基于前面的理论分析,我们修改了相应的文件进行了一番实际的验证。在验证的过程中我们遇到了和那位改错参数的网友一样的情况,就是反光完全消失,场景漆黑一片。后来发现原因是笔者在添加POW R1, specular.x, specExp.x;这句的时候误将specular.x拼写成Specular.x——由于Doom3使用的是C语言,对大小写敏感,所以笔者误将首字母s大写就使得该语句无法起作用,因而无法让GPU去计算出高光的范围,自然场景也就一片漆黑了。●实际性能测试





我们看到,成绩的提升现象的确是出现了,但是提升的幅度并不是很大。提升幅度最大的是在1280×1024的分辨率下,达到了7.43%。我们注意到,在分辨率变得更低的时候,成绩的提升幅度也越来越小,到了640×480的时候就保持了持平的状态。
●结论
对于这件事情,我们可以说:
首先,卡马克做的没错。因为在制作游戏的时候他需要考虑游戏的兼容性,所以采用这种方法是完全正确的;
其次,跟随卡马克使用这种方法的显示芯片厂商没有错。因为他们完全是按照卡马克的设计来运行游戏的,而且能够节省GPU的计算负担,从另外一个方面说,能够保证在贴图缓冲的调用上迅速而稳定也是芯片厂商设计实力的表现;
最后,对于ATI,我们认为他们扔掉《数学用表》、掏出“计算器”的做法也没有错。如果说有什么不足,只能怪ATI的显示芯片在贴图缓冲的调用上效能不是太好,而这次通过ATI员工在论坛发帖这种“半官方”的方式告诉大家的修改方法的确在不损失画质的前提下带来了性能的提升,这也是无可厚非的。但是,如果以偏概全、信口开河说通过修改可以使ATI显卡在Doom3中提升40%的性能,这就有些误导读者和用户的嫌疑了。