16bits色下的调色板


调色板的使用多在于节约内存, 这个概念也是从 VGA 256 色模式中来的, 当年硬件厂商做此设计, 多半也是因为节约珍贵的显存. 早在 2 年前, 我就和很多同志反复讨论过相关问题, 今天, 似乎已经该在 16bit 色和 24bit 色间决策了. 重提 8bit 调色板模式的使用, 仿佛已无太大必要, 但是网友 CXI 在留言板上提出新的观念, 我将其收录整理, 希望给大家一些启示.

PC 上使用调色板技术是上个世纪的事了 ;-) 那个时候的PC游戏, 多见于 256 色, 所谓 256 色, 实际是从 RGB666 (16bit) 色中选出需要的 256 种制作游戏的画面. 使每个像素点只占用1字节的内存, 而能表现出绚丽的画面.

由于这种模式下, 色彩的混合运算很难处理, 对于游戏图象技术的发展, 和内存越来越不值钱, 以及 CPU 速度的成倍增长, 游戏设计者们逐渐使用 16bit 色甚至 24bit 真彩. 可以说, 这类模式 比以前的调色板技术更容易使用. 而我心目中最棒的 256 色游戏 StarCraft, 再没有什么可以超越它.

在向 16bit 色过度阶段, 为了节约内存, 大家纷纷沿用调色板技术, 在内存中建立 512 字节的 调色板, 把图片 Blit 到backbuffer 上时, 自己转换成高彩. 这样可以节约一半的内存. 可惜是用速度做代价的, 查表操作比内存复制要慢的多.

6235 字节CXI 网友提出了一种折中的方案, 值得大家研究. 如果我们只使用高彩模式中高字节和低字节相同的 颜色会怎样呢? Intel 的 MMX 指令集里拥有 punpcklbw 分组指令可以快速将 0xaabbccdd 这样的 dword 变成 0xaaaabbbbccccdddd 形式的 qword. 这样, 8bit 到 16bit 的快速转换的问题便解决了. 而我们可以使用的 256 种颜色是怎样的? 我们可以看右图, 是我制作的 565 模式下的对应调色板。 除了灰度部分不足外, 基本覆盖了常用的颜色. 有兴趣的朋友可以 copy 下这个调色板, 在 Photoshop 或者 Paint Shop Pro(按Shift+0) 将一些游戏中的截图套进这个调色板里实验, 应该说结果还是让人满意的.

这种方式下, 数据转换是非常迅速的,比之传统的查索引表的方法可以快许多。 这样我们就可以节省一半图片所占用的内存,并且由於内存占用少,数据量传送就少, 图片可以以更快的速度从source传送到dest。因此这种方法可以大大的提高游戏的整体效率。

附:生成这个调色板的代码如下:
	for (i=0;i<256;i++) { 
		WORD v; 
		v=i|(i<<8); 
		int r,g,b; 
		r=v&0x1f; 
		g=(v&0x7e0)>>5; 
		b=(v&0xf800)>>11; 
		pPal[i]=RGB(r<<3,g<<2,b<<3); 
	}