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

为什么要实时转换颜色深度?

通常, 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;
这样当然是相当慢的, 所以我们还是要借助汇编. 而汇编能极大的优化它: lodsd    ;RRRRRRRR GGGGGGGG BBBBBBBB
shr eax,3    ;000RRRRR RRRGGGGG GGGBBBBB
shl al,2    ;000RRRRR RRRGGGGG GBBBBBxx
shl ax,3    ;000RRRRR GGGGGGBBB BBxxxxx
dec esi
shr eax,5    ;00000000 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 三个色素分开存放, 就将其变为了可能. 可以同时读入 4 个色素, 并行处理, 然后合并, 这样便在一个循环内处理了 4 个点. 考虑到 CACHE 的效率, 最好不要将 RGB 三块内存分的太开. 我的建议是, 位图的每一行分成三个部分, 即为 Red 段, Green 段 和 Blue 段.

上面的方法都是可以继续优化的, 本文旨在启发朋友们的灵感, 找出更好的方法.

时间: 2025-01-02 18:54:11

真彩色转成高彩色的快速算法的相关文章

卡萨帝全系多门冰箱上市囊括九成高端用户需求

"这个冰箱占地少,容量却不小,很适合我们一家三口","原来真有冰箱能把东西分类的这么仔细,甚合我意啊","冰箱还能降解农药?现代科技真是太神奇了"--9月23日,在上海由高端家电品牌卡萨帝主导的7年品牌战略暨全新产品发布会上,朗度系列多门冰箱全线亮相.现场参与者中,无论是媒体.客户,还是用户都纷纷表示找到了适合自己的那一款冰箱,不少业内人士表示:"卡萨帝全系多门冰箱足以满足九成高端用户的需求".时下,人们愈发注重食品的原味保鲜

2013年卡萨帝冰箱成高端冰箱第一品牌

日前,由国家统计局行业企业信息发布中心举办的第十八届全国商品销量信息发布会在人民大会堂召开,会上发布<2014年消费品市场咨询报告>并对2013年高端冰箱市场进行了分析与展望.报告数据显示,2013年卡萨帝冰箱凭借着19.39%的品牌市场占有率和22.44%的销售额市场占有率,稳居高端市场榜首,成高端冰箱第一品牌.调查数据统计,高端冰箱市场销量排在前5名的品牌为卡萨帝.西门子.三星.LG.海尔,这五强品牌合计占高端冰箱6成市场,同比去年市场集中度较高.业内人士指出,高端冰箱市场集中度的提升,是

超八成高收入人群使用网上银行

尼尔森新近出炉的个人金融综合报告显示,接近六成中国高收入人群将"便捷易达的服务"(56%)列为选择银行的首要标准,十分渴求高效银行为其提供更加周到的服务.此次是尼尔森首次推出针对高收入人群的年度金融综合报告,覆盖上海.北京.广州.深圳.成都和杭州六个主要城市. 调查显示,中国消费者在选择银行时,高收入人群优先考虑的是银行服务的实用性,而非银行产品的多样化以及银行品牌形象.选择"高品质的客户服务"和"综合性产品和服务"的高收入人群人数比例高达17%

系统-高铁环境 切换算法的研究仿真

问题描述 高铁环境 切换算法的研究仿真 我想问下有谁对LTE切换算法比较了解 我现在在研究高铁环境下TD-LTE系统切换算法的仿真研究 所以有谁比较了解这方面 如有帮助 不胜感激!

加密-求问有什么安全性比较高的加解密算法? des, 3des这种用的很多了吧应该

问题描述 求问有什么安全性比较高的加解密算法? des, 3des这种用的很多了吧应该 求问有什么安全性比较高的加解密算法? des, 3des这种用的很多了吧应该 解决方案 加密算法的强度不是取决于算法是否公开,而是取决于算法本身在数学上是否有解,以及密钥的强度. 所以aes这种工业级的加密算法,在相当的时间和应用范围内肯定是没有问题的. 解决方案二: 对称加密算法 对称加密算法用来对敏感数据等信息进行加密,常用的算法包括: DES(Data Encryption Standard):数据加密

七夕花市彩色玫瑰成新宠

目前每枝1.5元 节日前两三天将涨价 现在预订划算 "七夕订花么?"七夕临近,花市升温.今年七夕,彩色玫瑰可能会成为年轻人的新宠. 紫色.香槟色.淡粉色--昨日,记者在丰台区花乡花卉市场看到,除了常见的红玫瑰外,五颜六色的彩色玫瑰占据了最显眼的位置. 据商户介绍,彩色的玫瑰花统称为综艺玫瑰,受到年轻人喜爱.不少商户预计,今年七夕,综艺玫瑰将会走俏. 据了解,近几天开始有少量顾客提前订七夕节的花束,现在花的价格仍比较平稳. 目前,彩色玫瑰和红玫瑰的售价大约1.5元/枝,蓝色妖姬的价钱比较

win8系统温度高如何创建快速降温模式

  笔记本电脑的使用非常广泛,随着夏天的到来,相信很多用户都会发现笔记本电脑也很容易发热,这主要也是散热器的问题,大家也都知道散热器不能及时排除电脑热量的话,处理器在高温下会受到一定影响,系统也会变得运行缓慢,所以给系统创建快速降温模式来笔记本降温是很有必要的,下面以win8.1操作系统为例,看看是如何创建win8.1快速降温模式的. 快速降温模式方法/步骤: 1.打开控制面板,在资源管理器地址栏里面输入"控制面板",这样就可以打开Win8控制面板. 2.点击硬件和声音,接着继续点击电

个人网站真能转成商业网站,你能么?

个人网站 看到起点被收编了.hao123也回家数钱玩了.QQ挂机.色情短信.各种私服都火了,赚钱了.于是乎,工作室.soho.再创业者也就多了.千奇百怪的网站层出不穷.以为做个网站我就可以躺着数钱了....刚才一个朋友发给我这样一篇文章说得有些道理,故贴进来给大家看看....无论对于现在的个人网站还是所谓的个人商业网站,或许都有一些帮助..(以下是全文,作者不详) 网站没有价值,商业化就无从谈起.一个网站的价值,主要体现在以下三方面: 1: 规模性(量):网站必须已经具备了一定的规模,包括一定量

个人网站真能转成商业网站?

个人网站 看到起点被收编了.hao123也回家数钱玩了.QQ挂机.色情短信.各种私服都火了,赚钱了.于是乎,工作室.soho.再创业者也就多了.千奇百怪的网站层出不穷.以为做个网站我就可以躺着数钱了....刚才一个朋友发给我这样一篇文章说得有些道理,故贴进来给大家看看....无论对于现在的个人网站还是所谓的个人商业网站,或许都有一些帮助..(以下是全文,作者不详) 网站没有价值,商业化就无从谈起.一个网站的价值,主要体现在以下三方面: 1: 规模性(量):网站必须已经具备了一定的规模,包括一定量