0

我正在训练使用带有 c++ 的 allegro 库,但是我遇到了一个问题,在使用大图像作为视差背景时,我在屏幕上滚动时会遇到持续的负载/故障,使我的所有图像闪烁了一下,有没有加载背景而不会出现此类问题的方法?尝试打印屏幕时不出现闪烁。

谢谢

4

2 回答 2

1

我不能保证这是解决方案,但是查看您的代码,我不明白您为什么要创建多个缓冲区。

bufDisplay = al_create_bitmap(WIDTH, HEIGHT);
buffer = al_create_bitmap(WIDTH, HEIGHT);

除非您正在执行某种需要缓冲区的特殊效果,否则它们是不必要的。Allegro 5 已经提供了具有默认设置的双缓冲区。

只需将所有内容绘制到默认目标位图(显示器的后台缓冲区),然后al_flip_display().

如果要将输出居中或缩放到不同大小的窗口,通常可以只使用转换。

我不知道你为什么打电话Sleep(8)

如果使用 Windows,您可以切换到使用 OpenGL(设置ALLEGRO_OPENGL显示标志)。

您应该尝试其他 Allegro 游戏和演示(很多都带有源代码),看看它们是否都存在问题。

于 2013-06-29T15:56:39.163 回答
1

闪烁很可能是您重新绘制场景的结果,并且监视器在中途刷新。

解决这个问题的方法是使用双缓冲。读这个:

http://wiki.allegro.cc/index.php?title=Double_buffering

还有另一种称为“撕裂”的伪影,它是由刷新周期中的缓冲区位块引起的。这通常通过等待垂直同步(回溯)然后绘图来解决,但是现在我们大多数人都使用 OpenGL 或 DirectX 等库来与我们的图形硬件通信,这有点过时了。

尽管如此,Allegro 提供了一个等待垂直回扫开始的功能,这是您可以安全地对缓冲区进行 blit 而不必担心撕裂的时间。看这里:

https://www.allegro.cc/manual/4/api/graphics-modes/vsync

于 2013-06-25T03:08:57.327 回答