真彩色:真彩色转成高彩色快速算法

为什么要实时转换颜色深度? 
通常, 2D 游戏中位图, 无论在外存中按什么颜色深度存放, 加栽后都被转换成了需要颜色深度. 我们不太注意颜色深度转换说需要时间. 

但是, 现在区别了. 云风未来计划中, 最重要项是制作个超级 2D 引擎. 将支持 Voxel 物体和实时光线处理这样特性, 而且在光线处理中, 32 级光线亮度级别也远远不够, 所以, 未来 2D 游戏发展趋势应该是采用真彩色, 至少是在内部运算时使用. 在某些场合下, 我们可能需要做 15/16bit 高彩色输出, 所以有必要找到更快思路方法实时处理. 

下面, 我们对此做些探讨, 虽然显卡可以支持 15 或 16 bit 色中种, 但这里全部用 16bit 色举例: 

先来看看 C 版本: 

red=(truecolor>>8)&0xf800; 
green=(truecolor>>5)&0x7e0; 
blue=(truecolor>>3)&0x1f; 
hicolor=red|green|blue; 

这样当然是相当慢, 所以我们还是要借助汇编. 而汇编能极大优化它: 
lodsdRRRRRRRR GGGGGGGG BBBBBBBB 
shr eax,3000RRRRR RRRGGGGG GGGBBBBB 
shl al,2000RRRRR RRRGGGGG GBBBBBxx 
shl ax,3000RRRRR GGGGGGBBB BBxxxxx 
dec esi 
shr eax,500000000 RRRRRGGG GGGBBBBB 
stosw 

是不是精简了很多? 但不幸是, 虽然看起来很简洁, 但由于大量使用部分寄存器, 对流水线冲击很大. 代码几乎把流水线效率减到了最低. 优化方案很多, 我们可以在次循环里处理两个点, 分别使用 eax 和 ebx, 然后交错那些代码; 又或者将上面代码后半部分改为查表, 相信都能提高速度. 但是下面我还想提出另种方案, 采用 MMX 指令级: 
mm7=F800F800F800F800 
mm6=FC00FC00FC00FC00 
------------------------------ 
punpcklbw mm0,[red+edx] 
;mm0=RRRRRRRR 00000000 RRRRRRRR 00000000 RRRRRRRR 00000000 RRRRRRRR 00000000 
punpcklbw mm1,[green+edx] 
;mm1=GGGGGGGG 00000000 GGGGGGGG 00000000 GGGGGGGG 00000000 GGGGGGGG 00000000 
punpcklbw mm2,[blue+edx] 
;mm2=BBBBBBBB 00000000 BBBBBBBB 00000000 BBBBBBBB 00000000 BBBBBBBB 00000000 
pand mm0,mm7 
;mm0=RRRRR000 00000000 RRRRR000 00000000 RRRRR000 00000000 RRRRR000 00000000 
pand mm1,mm6 
;mm1=GGGGGG00 00000000 GGGGGG00 00000000 GGGGGG00 00000000 GGGGGG00 00000000 
psrlw mm2,11 
;mm2=00000000 000BBBBB 00000000 000BBBBB 00000000 000BBBBB 00000000 000BBBBB 
psrlw mm1,5 
;mm1=00000GGG GGG00000 00000GGG GGG00000 00000GGG GGG00000 00000GGG GGG00000 
por mm0,mm2 
por mm0,mm1 
;mm0=RRRRRGGG GGGBBBBB RRRRRGGG GGGBBBBB RRRRRGGG GGGBBBBB RRRRRGGG GGGBBBBB 
movq [dis+edx*2],mm0 
add edx,4 

我们对 MMX 运用是针对它并行运算, 直接从 RGB888 格式利用并行处理变成 RGB565 似乎不可能, 但是, 如果我们将 RGB  3个色素分开存放, 就将其变为了可能. 可以同时读入 4 个色素, 并行处理, 然后合并, 这样便在个循环内处理了 4 个点. 考虑到 CACHE 效率, 最好不要将 RGB  3块内存分太开. 我建议是, 位图行分成 3个部分, 即为 Red 段, Green 段 和 Blue 段. 
上面思路方法都是可以继续优化, 本文旨在启发朋友们灵感, 找出更好思路方法. 
Tags:  什么是真彩色 真彩色图像 24位真彩色 真彩色

延伸阅读

最新评论

发表评论