我正在训练使用allegro库与C++,但我得到一个问题,同时使用大图像parrallax背景我得到一个不断的负载/故障滚动屏幕下,使我所有的图像闪烁有一点,有没有办法加载背景没有这样的问题?当我尝试打印屏幕时,闪烁不出现。C++ Allegro视觉故障
感谢
我正在训练使用allegro库与C++,但我得到一个问题,同时使用大图像parrallax背景我得到一个不断的负载/故障滚动屏幕下,使我所有的图像闪烁有一点,有没有办法加载背景没有这样的问题?当我尝试打印屏幕时,闪烁不出现。C++ Allegro视觉故障
感谢
的闪烁是最有可能你重绘场景,并通过监视器中途刷新的结果。
治疗方法是使用双缓冲。阅读:
http://wiki.allegro.cc/index.php?title=Double_buffering
还有一个神器叫做“撕裂”,它是由一个刷新周期期间阻击器的缓冲区引起的。这通常是通过等待垂直同步(回溯)然后绘制来解决的,但是现在有点过时了,我们大多数人都使用OpenGL或DirectX等库来与我们的图形硬件进行通信。尽管如此,Allegro提供了一个等待垂直回溯开始的功能,这是您可以安全地擦除缓冲区而不用担心撕裂的时间。在这里看到:
我不能保证,这是解决方案,但在看你的代码,我不明白为什么要创建多个缓冲区。
bufDisplay = al_create_bitmap(WIDTH, HEIGHT);
buffer = al_create_bitmap(WIDTH, HEIGHT);
除非你正在做某种需要缓冲区的特殊效果,否则它们是不必要的。 Allegro 5已经提供了一个默认设置的双缓冲区。
只需将所有内容都绘制到默认目标位图(显示器的后台缓冲区),然后al_flip_display()
。
如果要将输出集中或缩放到不同大小的窗口,通常可以使用转换。我不知道你为什么打电话Sleep(8)
。
如果使用Windows,可以切换到使用OpenGL(设置ALLEGRO_OPENGL
显示标志)。
你应该尝试其他Allegro游戏和演示(大量来源),看看它们是否都有问题。
Allegro 5的默认设置不应导致任何撕裂问题。你可以发布一些链接到一些代码和图片来说明你的问题吗? – Matthew
第一个链接有与绘图相关的代码的主要部分:http://pastebin.ca/2409101第二个链接是http://pastebin.ca/2409099的原型的整个代码。我接受的任何屏幕图像都没有显示出问题,但是,它出现在我测试它的任何平台上 – Ted
只是快速一瞥。您对'al_set_new_display_option()'的调用不会执行任何操作,因为您已经创建了显示。它们只影响未来的'al_create_display()'调用。所以如果你想看看这些设置是否有帮助,你需要在创建显示之前调用它们。 – Matthew