为什么写显存比读显存速度快?

我在写游戏的时候使用了显存双缓冲,即创建两个视频位图,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。差异如此之大!

 

但是我还是不明白为何读取显存会那么慢!难道是因为某些同步的原因么?

为什么写显存比读显存速度快?》上有6条评论

  1. Xiaoxia

    @shindow: Triple Buffering, 很早就听过,但是一直没有尝试使用过。谢谢你的链接,我去学习下!

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>