在主循环外绘制背景时闪烁

Flickering when drawing the background outside of the main loop

这是我的代码:

#include <SFML\Graphics.hpp>
sf::RenderWindow renderWindow(sf::VideoMode(300, 300), "The Problem");
int main()
{
    sf::Texture tX;
    tX.loadFromFile("Recursos/Fondo.png");
    sf::Sprite tXt(tX);
    renderWindow.draw(tXt);
    while (true) // main loop
    {
        renderWindow.display();
    }
}

tX 是一个大精灵(想想:背景),所以我想避免每帧重绘它。

当我尝试这个时,我开始闪烁,我不知道它来自哪里。

你的代码,简化,伪:

Initialize();
Draw();
Loop {
    Display();
}

您正在做的是将场景绘制到缓冲区(顺便说一下,没有先清除它),然后循环显示它(没有重绘任何东西)。

我认为您出现闪烁的原因是双缓冲 (v-sync)。 最终发生的事情是您绘制到一个缓冲区,但将另一个缓冲区留空。当您显示活动缓冲区时,它们会翻转(因此下次您显示时,它是一个空缓冲区)。 你真的应该在循环中画画。


或者,您可以禁用多缓冲,或尝试绘制、显示、再次绘制,然后循环(这样您就可以绘制到两个缓冲区,假设只有两个缓冲区)。

两种解决方案都不优雅。

如果绘制背景真的需要优化,恐怕 SFML 不会给你那个粒度。您可能想看看 OpemGL Stencil 魔法。