2013-06-25 81 views
0

我正在训练使用allegro库与C++,但我得到一个问题,同时使用大图像parrallax背景我得到一个不断的负载/故障滚动屏幕下,使我所有的图像闪烁有一点,有没有办法加载背景没有这样的问题?当我尝试打印屏幕时,闪烁不出现。C++ Allegro视觉故障

感谢

+1

Allegro 5的默认设置不应导致任何撕裂问题。你可以发布一些链接到一些代码和图片来说明你的问题吗? – Matthew

+0

第一个链接有与绘图相关的代码的主要部分:http://pastebin.ca/2409101第二个链接是http://pastebin.ca/2409099的原型的整个代码。我接受的任何屏幕图像都没有显示出问题,但是,它出现在我测试它的任何平台上 – Ted

+1

只是快速一瞥。您对'al_set_new_display_option()'的调用不会执行任何操作,因为您已经创建了显示。它们只影响未来的'al_create_display()'调用。所以如果你想看看这些设置是否有帮助,你需要在创建显示之前调用它们。 – Matthew

回答

1

的闪烁是最有可能你重绘场景,并通过监视器中途刷新的结果。

治疗方法是使用双缓冲。阅读:

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

还有一个神器叫做“撕裂”,它是由一个刷新周期期间阻击器的缓冲区引起的。这通常是通过等待垂直同步(回溯)然后绘制来解决的,但是现在有点过时了,我们大多数人都使用OpenGL或DirectX等库来与我们的图形硬件进行通信。尽管如此,Allegro提供了一个等待垂直回溯开始的功能,这是您可以安全地擦除缓冲区而不用担心撕裂的时间。在这里看到:

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

+0

在allegro5中有其他方式可以使用blit或vsync吗?我无法弄清楚如何使用此版本的库调用它们 – Ted

+1

看来,在Allegro 5中,您不必担心缓冲或vsync,因为它现在使用硬件加速。看看这里:https://www.allegro.cc/manual/5/al_flip_display - 如果你正在使用Allegro 5,你不应该看到闪烁。 – paddy

+1

除了我最近的评论,看起来你可能需要明确地创建你的显示缓冲。请参阅https://www.allegro.cc/manual/5/al_set_new_display_option – paddy

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游戏和演示(大量来源),看看它们是否都有问题。

+0

我确实使用了多个缓冲区来在不同分辨率的情况下调整屏幕大小,以保持图像的细节水平,但是,即使有一个缓冲区,我仍然遇到这个问题。设置openGL将通过al_set_new_display_flags(ALLEGRO_OPENGL)?我这样做,但它只是崩溃,说显示无法初始化。我会尝试在allegro论坛中找到是否有其他人遇到过这种情况,谢谢 – Ted

+0

@Ted,这是正确的。如果在创建显示时崩溃,听起来像是非常错误的。如果不加入调试器,无法确定会导致什么结果。 – Matthew