【问题标题】:SFML: Draw only once and render foreverSFML:只绘制一次,永远渲染
【发布时间】:2021-07-15 07:29:48
【问题描述】:

我正在尝试用 C++ 编写一个应用程序来在屏幕上绘制静态 2D 的东西。 SFML 上的指南说要执行以下操作

while (window.isOpen())
{
    sf::Event evnt;
    while (window.PollEvene(&evnt))
    {
        /* Handle events */
    }
    window.clear();
    window.draw(/* 2D stuffs go here */);
    window.display();
}

但我不想浪费我的资源一遍又一遍地绘制相同的图形。有没有办法只绘制一次(在while循环之前)并永远显示(在while循环内)?

附: - 我试图将window.clear()window.draw() 带到主循环之外。但是屏幕闪烁。

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    您可以使用sf::RenderTexture 来绘制静态对象。然后创建一个使用该纹理的sf::Sprite 并使用它一次绘制它们。

    sf::RenderTexture bgTex;
    bgTex.create(windowWidth, windowHeight);
    bgTex.draw(your_object_1);
    bgTex.draw(your_object_2);
    // the rest of the static objects
    bgTex.display() // important !
    sf::Sprite background(bgTex.getTexture());
    

    现在您只需要绘制该精灵而不是重复绘制所有对象。这是一个相当耗时的优化。

    window.clear();
    window.draw(background); // single call :D
    window.draw(...); // draw your dynamic objects
    window.display();
    

    编辑: 另外,请注意sf::RenderTexture 仍然可以根据需要进行修改,并且使用它的精灵将反映更改。所以如果你想改变背景,你只需要在bgTex上清除一次,不用担心其他任何事情。

    【讨论】:

    • 谢谢。那行得通!现在只有一个小问题。当我使用纹理绘制时,y 轴是倒置的。
    • @Sayan 哎呀,那是因为我们在绘制静态对象后忘记了display 渲染纹理。我要更新我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2021-11-20
    • 2017-11-03
    相关资源
    最近更新 更多