------
kankankan
------
完全没看懂,我面壁去了~~~
------
看到晕头转向..
假设你有5个层+1个背景,实际上是6幅图..其中两幅贴满小的图片..
bmp_bg;
bmp_layer[5];
然后假设往bmp_layer[0]/bmp_layer[1]帖满小图,再混合所有.
那么,是否bmp_layer[0]/bmp_layer[1]每次都需要全部重新全部贴上所有不同的小图呢?
不用layer直接往bg上透明BitBlt不行么?
------
我觉得楼上有人说的: 因为贴图会覆盖, 所以只需更新覆盖区域
------
to : lambochan
正如你所说,
那么,是否bmp_layer[0]/bmp_layer[1]每次都需要全部重新全部贴上所有不同的小图呢?
这两个层的重画,是在需要时,不是每次都要
其实耗时的是在这两个层上的小图重画(比如对小图的撤消,撤消是将操作记录清除最后一步,然后再在原始图上画上所有的小图片(耗时就在这里)),每个层的透明叠加,不会很耗时
------
1: layer里的小图片不能用单纯擦除技术而要全部重绘?
2: 小图片是不规则的且每次帖上layer时都要和layer原图作透明运算?
3: 小图片是动态生成的,而不是load文件load出来的?
4: 所有的一切都要实时计算,而不能预先存为文件,用空间换时间?
按你所说,其实你只要解决了小图贴上那两个layer的速度,你就可以解决你的问题了?
------
照计单纯bitblt几百张小图片应该不会很慢的啊?
偶把GB2312整个编码汉字BltBlt()一遍(TextOut()到16x16的小图片,BitBlt()到一幅大图上,总计BitBlt()了6千多次),都很快呢..当然,是连写字一起算.
------
haihaole
------
我想楼主可能钻牛角尖了,应该换个思维方式,才能明白以上各位的方案。
要把分层处理图片和将处理过程显示出来区分开来。
先说图片分层:首先要明确图层只是个虚拟平台,层的多少,可根据需要确定,既然你觉得将很多小图片或者文字绘制到一个图层上很耗时,为什么不直接把每个小图片作为一个单独的图层处理,而非要实现绘制到一个图层上?你可能考虑到小图片尺寸,可以确定一个类或者记录作为虚拟图层层面,大小一样,记录下小图片的坐标,就是一个独立的图层了。如此一来,在拼合之前,每个图层可灵活组装、添加和拆卸,根本就不耗时。
再说显示处理过程,其实每个过程的显示都相当于一次图层拼合,这可能就是你所说的耗时,我已经给你说过了,这是没办法的事,显示器是物理的,没法“分层”,每次都得从头开始绘制,连操作系统本身都是这么干的。当然,如何快速的显示应该讲究,GDI+的DrawImage过程是很慢的,不建议使用;TBitmap不能很好的显示透明图片,所以也不合适,剩下来只有2种方法:一是使用Windows API,二是自己合成到屏幕画布上,我建议你在后台拼合好图层,一次性刷新到屏幕(相当于使用双缓冲)。
我上次给你的24位与32位图片合成方法可用于图层的拼合,那种方法是比较快的(我指的是“方法算法”,但是我给你的过程中含除法会影响速度,可改为:((Spurce Alpha * Source RGB) + (256 - Source Alpha) * Dest RGB) + 255) shr 8),如果图层比显示窗口大很多,应作局部图层合成,以提高速度。如此还嫌速度慢,只能用ASM、MMX等进一步优化了。
------
楼上的和我讲得意思差不多,一个层一个类,每个类中都记录了层的位置坐标以及其他的诸如透明混合方式等信息,显示的时候 也只能从第一个层计算到最后一个层得到混合后的显示数据,然后再把这个显示数据一次性绘制到你的目标DC上。
我的博客上写的很清楚啊
这个计算是没有办法的事。
------
呵呵,没改彻底,代码中的[xxx].TImageOperate.xxxx改为[xxx].TImageData.xxxx
------
学习
------
汇编的牛人
以前帮人弄过一个类似的,不过是两个图片合成,多个图片应该也差不多
楼主可以到下面的帖子看看
http://topic.csdn.net/u/20090305/11/de000540-4968-4152-afc0-779ffac4938b.html
------
想了半天,与其给你一大堆理论建议,不如直接推荐一个支持图层和Alpha通道的库:P:http://graphics32.org
------
应该针对非mmx、mmx、sse写不同的代码,现在主流cpu都至少支持sse,128bits的xmm寄存器操作起来比64bits的mmx寄存器效率更高
------
------
mark
------
都是些牛人,太羡慕你们了
------
LZ在做Game? 屏幕上有几百个不停地动来动去的"精灵" ?
------
------
例如要擦除某个元素,只需要往该区域矩形把原来的BG图该区域帖回去不就擦除了?
:
这些小图片有可能在某个位置上是重叠,也就是说,清除了这个,它下面一层还有一个,或是多个,取混合输出图的背景覆盖的方法应该不行
------
恩 不错值得考虑
------
------
up
------
hao
------
不懂
------
UP...
------
操作图层时,应该只需要处理某个区域内的数据,而不需要处理所有的区域,这样速度会快很多
------
------

------
学一学
------
以前我以为考上大学就可以幸福了,后来发现我找不到工作;
后来我以为找到工作就可以幸福了,后来我发现delphi要掌握很多东西;
再后来我以为掌握了delphi就可以开始幸福了,后来发现我还不懂很多重要的技术;
再以后我以为有了技术就可以幸福了,后来发现我还是错了;
不过我还是搞懂一点:幸福不需要技术,在中国尤其如此。
------
貌似看懂 呵呵 要是我每个小图遍历一个方法,设置初始值和变量,然后处理小图的时候调用一个方法!速度应该还可以吧
桂ICP备07017180号