关于 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
Posted by: 红色警戒 | (8) May 25, 2008 10:43 PM
Posted by: kypck | (7) May 24, 2008 10:26 PM
Posted by: joe wulf | (6) May 24, 2008 04:50 PM
Posted by: kypck | (5) May 24, 2008 11:20 AM
Posted by: kypck | (4) May 24, 2008 11:10 AM
Posted by: kypck | (3) May 24, 2008 11:08 AM
Posted by: Bruce | (2) May 24, 2008 01:03 AM
Posted by: joe wulf | (1) May 23, 2008 08:30 PM