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

Flickering when drawing the background outside of the main loop

本文关键字:背景 闪烁 绘制 循环      更新时间:2023-10-16

我的CODE:

#include <SFMLGraphics.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是一个大的精灵(想想:背景),所以我想避免每帧重画它。

当我尝试这个,我得到闪烁,我不知道它是从哪里来的

您的代码,简化,pseudo:

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

你所做的是将场景绘制到缓冲区(顺便说一下,不首先清除它),然后在循环中显示它(不重新绘制任何东西)。

我认为你有闪烁的原因是由于双重缓冲(v-sync)。最后发生的情况是,你画到一个缓冲区,而把另一个空着。当您显示活动缓冲区时,它们会被翻转(因此下次显示时,它是一个空缓冲区)。你真的应该在循环里面画。


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

两种解决方案都不美观。

如果绘制背景确实需要优化,恐怕SFML不会给你这种粒度。你可能想看看OpemGL Stencil巫术