关于提高AlphaBlend效率的思考_gdi alphablend优化-程序员宅基地

技术标签: DirectUI/emWin界面技术  

原文地址::http://blog.csdn.net/alien75/article/details/5935957


在做UI开发的时候,如果要实现比较漂亮的界面是需要大量用到透明渐变效果及不规则图片的,在前一篇中<关于TransparentBlt和AlphaBlend的不同>中曾经总结过要想显示当图像象素具有不同透明度或不规则图形边缘有渐变色需要平滑显示时要用alpha运算,特别是象素级alpha运算才能达到理想效果。

常规的alpha运算一般是调用系统的AlphaBlend(在下面所提到相同的函数名均是指系统函数)对图像资源进行混合运算,而常用的图像资源中一般是用到PNG和BMP。前者因为是进行了编码并能够携带Alpha通道信息,因此它的优点是:占用的空间要比BMP小,而且因为携带A通道信息就可以在做图的时候随心所欲的制做各种特效,在设备上解码后就可以用AlphaBlend显示了,缺点是因为需要解码所以设备要有相应组件(如Imaging)或其它解码器(如CxImage),而且如果设备配置不高的话解码速度也会打折扣;后者是无压缩的所以占用空间要比PNG大,但是却可以省掉解码这一步直接用GDI的DDB或DIB就可以操作了,缺点是32位以下的位图是不带A通道信息的,这样在做图的时候就不如PNG那样随意,而且在显示不规则的图形时因为只能指定单一透明色在边缘就会有锯齿影响显示效果。

有一个好的消息就是BPP32的BMP是可以携带A通道的,但是也有两个不太方便的地方就是:1、在PC下能够设计这种BMP的工具软件就算闻名如Photoshop都不是很方便,在实际开发中往往是先用IconWorksho这个软件将photoshop设计的PNG转换成32BPP的BMP;2、在用AlphaBlend对32BPP的BMP进行运算得出的并不是想象中的结果,这是因为需要将BMP预处理为PARGB格式,关于PARGB格式及转换公式可以在网上或MSDN对AlphaBlend参数BLENDFUNCTION说明中找到。

前面所提到的方法基本上就可以能够设计出漂亮的图片并且按预想的结果显示出来了,但是有一个很现实的问题就会出现了:漂亮的界面不是一副或两副就行了的,它是各种漂亮元素及特效组合起来的,为此会存在大量的alpha运算,在这种情况下AlphaBlend就有点力不从心了。如何提高alpha运算的效率呢?我想有几种方法可供选择:

1、用DIB管理BMP资源,然后直接用内存操作来实现象素的混合运算。经过一个大概的测试发现要比系统的函数要快很多,这个原因可能一个是AlphaBlend检测条件比较多,二来可能调用的是GDI的SetPixel,而SetPixel因为还执行了一些额外的操作效率是比较低的,不象DIB直接操作内存。不过AlphaBlend缩放算法做得很不错,自实现alpha运算需要缩放并能不能也达到所需效果是一个值得考虑的问题。

2、改进自实现混合算法,降低象素运算总的循环次数,自然速度就提高了。

3、将改进后的混合算法用汇编来实现,这个需要对平台指令有相当了解才能进行。
而下面的方法对平台架构的依赖性较大,需要根据具体情况决定。

4、ARMv6架构的SIMD指令实现:关于SIMD可以网上查找。比如MMX指令一次能对4个象素点进行混合运算,理论上而言速度能提高四倍。

5、LCD控制器具有Overlay、Aalpha、Colorkey功能:不过就掌握的情况来看只能进行常量的混合运算。

最后补充一点:关于是用PNG还是BMP,这要看设备的实际运行情况:可能有是瓶颈是在解码,而有的是在文件IO操作。。。,不过把alpha运算这个最大的瓶颈解决了这都好办了,而且如果借鉴很多游戏的做法把资源打包,在需要的时候加载不需要的时候卸载,对于象BMP这种压缩率能超过50%的文件将它加载到内存再解压应该还是要比单纯加载未压缩的要快吧。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xqhrs232/article/details/8113092

智能推荐

Cocos2d-x技能冷却还要等多久?---之游戏开发《赵云要格斗》(9)_cocos creator 开发格斗游戏-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏3次。本文将主要来实现游戏开发过程中,技能冷却的实现,一个按钮点一次后,就会有一个冷却时间,得等冷却时间过了之后,你才能再次点击,一般这是实现特殊技能的。在这里,我也自己写了一个类,非常方便,只要把这个类加到你的工程中,加两张图片,就可以实现功能了。_cocos creator 开发格斗游戏

vue中v-html识别\n换行_v-html /n-程序员宅基地

文章浏览阅读1.3w次,点赞7次,收藏12次。如果需要合并空格可以使用:附:white-space属性(来源于MDN)normal连续的空白符会被合并,换行符会被当作空白符来处理。换行在填充「行框盒子(line boxes)」时是必要。nowrap和 normal 一样,连续的空白符会被合并。但文本内的换行无效。pre连续的空白符会被保留。在遇到换行符或者元素时才会换行。pre-wrap连续的空白符会被保留。在遇到换行符..._v-html /n

操作系统-进程调度--优先级调度算法和时间片轮转算法_时间片轮转流程图-程序员宅基地

文章浏览阅读5.8k次,点赞7次,收藏58次。一、实验内容与要求优先权法、轮转法简化假设1)进程为计算型的(无I/O)2)进程状态:ready、running、finish3)进程需要的CPU时间以时间片为单位确定算法描述1)优先权法——动态优先权当前运行进程用完时间片后,其优先权减去一个常数。2)轮转法要求1)产生的各种随机数的取值范围加以限制,如所需的CPU时间限制在1~20之间。2)进程数n不要太大通常取4~8个3)使用动态数据结构4)独立编程二、实验流程图三、实验分析优先权调度算法首先,时间片轮转法需要_时间片轮转流程图

[解决方案]spark 2.4 报错:grouping expressions sequence is empty, *** is not an aggregate function.-程序员宅基地

文章浏览阅读1.6w次。一、报错详情codeselect id , content_mapfrom test_db.test_tbhaving content_map is not null errorgrouping expressions sequence is empty, and 'test_db.test_tb.`id`' is not an aggregate function. Wrap ..._grouping expressions sequence is empty

[LaTex]PDF导出方法及常用设置_texstudiozm怎么导出pdf版本-程序员宅基地

文章浏览阅读1.2w次,点赞7次,收藏38次。在选项中选择设置Texstudio,可以会有很多设置参数,可以在构建中,设置默认编译器,默认PDF查看工具,默认文献工具等 可以在常规里,设置Texstudio界面中文显示,等 可以在命令中,设置外部PDF查看器地址等以上是经常用到的设置,一般是一开始就需要用到,列出来,还有很多可以自行查看。回到正题,设置好你的外部PDF查看器,这个就是你的PDF工具的地址,一般是安装上P..._texstudiozm怎么导出pdf版本

Emulator: G:\Android_SDK\emulator\qemu\windows-x86_64\qemu-system-x86_64.exe:Could not open 'C:\Use_j:\android\sdk\emulator\qemu\windows-x86_64\qemu-s-程序员宅基地

文章浏览阅读7.1k次。问题:Emulator: G:\Android_SDK\emulator\qemu\windows-x86_64\qemu-system-x86_64.exe: Could not open 'C:\Use...就是表示启动的AVD包含中文目录解决方案:将用户下的.android\avd下的对应文件剪切到别的地方_j:\android\sdk\emulator\qemu\windows-x86_64\qemu-system-aarch64.exe: pci bus

随便推点

python怎么表示循环小数_python如果一个数是为无限循环小数,返回分数格式,否则返回小数格式...-程序员宅基地

文章浏览阅读795次。1.读题2.思考一个最简分数,分母如果只包含2和5的因数就可以化成有限小数.如果含有2和5以外的因数就只能化成无限循环小数.例如:1/2,1/8,1/20,5/32,9/40就可以化成有限小数.1/3,1/14,9/55,8/21只能化成无限循环小数.3.码代码# -*- coding: utf-8 -*-from fractions import Fraction#判断一个数的因数是否包含2或者..._python/算数结果无限循环数会如何表达出来

Android 源码编译及真机刷机实录_android_product_out-程序员宅基地

文章浏览阅读2.9k次。最近接到一个项目,需要接触 Android 源码,所以走了一遍源码编译和刷机的过程,从开始到成功花了差不多一周的时间,踩了很多坑,在此记录一下。整体分为四个部分:环境配置源码下载源码编译镜像刷机1、环境配置参考:https://source.android.com/source/initializing.htmlAndroid 源码需要在 Linux 或 Mac OS 上编译,..._android_product_out

Linux详细使用_linux -type d -exec cp {}-程序员宅基地

文章浏览阅读530次,点赞2次,收藏7次。Linux详细使用(环境搭建后续补充)1-走进Linux系统开机登录:开机会启动很多程序,它们在Windows叫做“服务”,在linux就叫做“守护进程”。开机成功后,它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,密码,输完回车即可。如下图:关机:在linux领域内大多用于服务器上,很少遇到关机的操作,毕竟服务器跑一个服务是永无止境的,除非特殊情况下才会不得已关机。关机指令为shutdown;sync # 将数据由内存同步到硬盘中。sh_linux -type d -exec cp {}

【2021-7月】渗透测试/安全服务实习生面试题&经验分享_杭州默安科技安全服务面试题-程序员宅基地

文章浏览阅读2.3w次,点赞82次,收藏409次。渗透测试实习生和安全服务实习生的面试题,企业有知道创宇,安恒信息,默安科技,奇安信四个企业。面试题本人能记多少就写多少,可供参考,祝大家成功拿到offer。_杭州默安科技安全服务面试题

safari自动填写脚本_脚本 | JD京东多合1签到+定时任务 | cookie获取教程-程序员宅基地

文章浏览阅读1.3w次,点赞3次,收藏22次。运行环境:系统:iOS用户软件:系统自带的app “快捷指令”所需:cookie、签到脚本步骤一:获取cookieps:获取cookie方法有很多种,有通过抓包工具、网页开发者调试等。这里介绍本人开发的工具去获取,相对简单化:JD cookie获取工具下载链接:https://wwi.lanzous.com/ijEaZkwizvg步骤二:添加快捷指令脚本指令脚本添加链接:https://..._圈x京东签到脚本

【论文阅读+实现】BPR: Bayesian Personalized Ranking from Implicit Feedback-程序员宅基地

文章浏览阅读5.8k次,点赞7次,收藏39次。1.BPR是什么?BPR 的全称是贝叶斯个性化排序(Bayesian Personalized Ranking),它是一种排序算法,做的是TopN任务。适用于隐性反馈数据,当然显性反馈数据把评分变成隐性的也行。以往做TopN任务的做法是利用用户的行为数据,得到用户对所有物品的预测评分,按照分数的高低进行排序推荐,比如FunkSVD。以往那些方法的建模目标是对于要进行推荐的物品尽可能的预测..._bpr: bayesian personalized ranking from implicit feedback

推荐文章

热门文章

相关标签