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

我在写游戏的时候使用了显存双缓冲,即创建两个视频位图,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, 很早就听过,但是一直没有尝试使用过。谢谢你的链接,我去学习下!

    回复

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据