« 防止中间人攻击 | 返回首页 | 会抽到自己的那张吗? »

关于 openGL 的 4444 贴图

我们在实现游戏界面时,用了一张 RGBA 4444 的贴图做 buffer 。最近同事测试效率时总不满意,发现上载 4444 贴图时,openGL 表现出来的性能实在是太差。(显卡为 ATI X300 ,最新版驱动)

几个人一开始怀疑是显卡或驱动程序的缺陷,进而想换总做法,不用软件渲染界面的方案。改把界面元素全部放到显存里。前几年,我为天下二设计界面的模块时,也有同事有此疑惑,编写代码做过比较。记得当时的结论是:仅仅从性能角度上考虑,把界面所用资源全部放到显存里,并不能提高太多速度(反而可能性能更低)。当时用的 Direct3D 做底层,似乎没有今天遇到的问题。

后来又经过测试,如果这张贴图换成 RGBA 8888 时,速度可以提高几倍。我们揣测可能是因为现代显卡对不常用的 16bit RGBA4444 贴图模式放弃了(软件或硬件)支持的缘故。原本希望采用 16bit 贴图节省一半的显存传输带宽,没想到适得其反。

一度,我们考虑了更换界面的美术制作标准,换为 RGBA8888 的格式。甚至讨论设计了一种采用 DXT 压缩算法压缩的图片内存数据格式。

不过我有点不死心,多试了几次。后来发现,居然把 GL_UNSIGNED_SHORT_4_4_4_4 换成 GL_UNSIGNED_SHORT_4_4_4_4_REV 速度就明显提高了 :D 比 8888 的模式要快许多。

想来是 ATI 的 openGL 驱动没有写好。上载贴图时,一旦和硬件支持的色彩模式不符,用了一种极其低效的方式做像素格式转换。

btw, 测试了另几块不同的显卡,有的显卡(比如一些较新的 N 卡上,GL_UNSIGNED_SHORT_4_4_4_4_REV`GL_UNSIGNED_SHORT_4_4_4_4 几乎没有区别。

Comments

kypck看来是OPENGL的人 :-)
@joe wulf 我现在发帖的机器上也用N卡。不过万事都是有理由的,当你说某个东西好或不好时,请给出理由,或许别人能给你解释或纠正你的错误。 鉴于你的回帖没有提用任何有用信息,所以我不得不继续失明,但不是选择性的,因为我的确看不到有信息量的文字。如有冒犯,请多包涵;如要抬杠,恕不奉陪。
@kypck 我现在用的是N卡,我曾经拥有一张A卡,其OGL性能奇差无比,不过我没在上面开发过。 所以,你可以选择性失明,当没看见我留言。
记得当时的结论是:仅仅从性能角度上考虑,把界面所用资源全部放到显存里,并不能提高太多速度(反而可能性能更低)。当时用的 Direct3D 做底层,似乎没有今天遇到的问题。 ------------------------------ 关于这个,希望楼主继续深究下去,我相信是因为你们开发人员对opengl API以及runtime&driver的理解有限所至。
同时也请一楼的wulf列举一些用ATI卡做OGL时“痛苦无常”的事情。
有意思的,不过楼主没有告诉大家之所以然。 _rev的意思是reversed component ordering,即告诉glteximage2d以“相对于format参数相反”的方式去解释传进来的数据。但硬件内部并不是所有format都支持的,比如rbga支持,bgra却不支持。为了完成这种外部数据到内部layout的转变,driver和硬件有两个机会做这个事情: 1. 在glteximage2d的调用时,用CPU或专门的硬件完成转换,并上载到显存中; 2. 在运行时,通过pixel shader硬件的swizzle功能来完成; 我不太清楚楼主所说的性能问题是指在glteximage2d调用还是运行时,或是两者都。 对于1,如果没有专门的硬件的话,反序一个4444的short类型的开销相信楼主很清楚。 对于2,对于x300这古董来说,这种逆序的swizzle或许有些性能问题。 一个小建议:仍然用GL_UNSIGNED_SHORT_4_4_4_4,但吧format换成相反顺序的,看看性能如何。
深究问题可能会对一些东西理解的更透彻.做程序的有些情况会疏忽也可难免,他们做驱动的可能没考虑全.
用ATI卡做OGL=痛苦无常

Post a comment

非这个主题相关的留言请到:留言本