在主循环外绘制背景时闪烁
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 魔法。
这是我的代码:
#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 魔法。