我在写游戏的时候使用了显存双缓冲,即创建两个视频位图,video1和video2。当前显示的为video1的时候,那么就把对象位图就拷贝到video2上,然后调用显存操作函数,把显示页面设置为video2,这样就不会出现拷贝对象时屏幕闪烁的问题,也不需要在内存里开辟一个内存位图的缓冲区。
最近在写一个屏幕渐亮和渐暗(Fade in and Fade out ),用于切换场景,需要对当前屏幕的位图进行alpha拷贝输出,但是我发现直接在显存上进行alpha拷贝时,速度慢得可怜!
然后在Allegro的API手册里找到了相关说明:
“Because it involves reading as well as writing the bitmap memory, translucent drawing is very slow if you draw directly to video RAM, so wherever possible you should use a memory bitmap instead.”
之后,我就在渐变发生的时候采用内存位图代替显存位图来解决这个问题。同时得出下面的结论:
把内存中的位图拷贝到显存里:
blit(membuf, videobuf, 0, 0, 0, 0, membuf->w, membuf->h);
把显存中的位图拷贝到内存里:
blit(videobuf, membuf, 0, 0, 0, 0, membuf->w, membuf->h);
前者瞬间完成,时间可以忽略。后者很慢,如果位图大小为1600*1000,大概需要0.5-1s。差异如此之大!
但是我还是不明白为何读取显存会那么慢!难道是因为某些同步的原因么?
猜想:难道说membuf->videobuf是直接的,videobuf->membuf是间接的?
你看看能不能像这样设计成“三缓冲”哇
http://www.codeproject.com/KB/graphics/SimpleVectorShapes.aspx
@shindow: Triple Buffering, 很早就听过,但是一直没有尝试使用过。谢谢你的链接,我去学习下!
写可以乱写 不用知道写到哪了
读就不能乱读 要按顺序读 知道读哪了
Kiming:
读按顺序读是什么意思,是窗口对齐问题吗?
桌面窗口应该是对齐的吧?
我对窗口的概念比较模糊。。。不知道它是什么工作原理!!!