C++ 运行最基本的sfml应用程序时出现性能问题

C++ 运行最基本的sfml应用程序时出现性能问题,c++,sfml,visual-studio-2019,C++,Sfml,Visual Studio 2019,我目前正在从事一个SFML项目,我在过去做过一些。但我现在遇到了一个大问题。我有严重的性能问题。我用一个简单的主函数替换了我所有的代码,你可以在SFML网站上找到这个函数,但是这个应用程序太落后了,以至于要永远关闭它 我试过清洗溶液,但没用。通过查看任务管理器,我也找不到任何问题。CPU、GPU、磁盘和内存的使用似乎还不错。 运行我的一些旧问题可以很好地工作。没有任何滞后 我已经将include目录添加到其他include目录中, 我已将库添加到其他库目录中, 我已链接到我的其他dependen

我目前正在从事一个SFML项目,我在过去做过一些。但我现在遇到了一个大问题。我有严重的性能问题。我用一个简单的主函数替换了我所有的代码,你可以在SFML网站上找到这个函数,但是这个应用程序太落后了,以至于要永远关闭它

我试过清洗溶液,但没用。通过查看任务管理器,我也找不到任何问题。CPU、GPU、磁盘和内存的使用似乎还不错。 运行我的一些旧问题可以很好地工作。没有任何滞后

我已经将include目录添加到其他include目录中, 我已将库添加到其他库目录中, 我已链接到我的其他dependenciese.g。sfml-audio-d.lib, 我已经在调试/发布文件夹中粘贴了必要的DLL

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

从提供的信息很难说这是从哪里来的。因为您的代码中没有时间步长,所以它可能以最大FPS运行。我始终建议在绘制图形时考虑时间步长。时间步长是不同帧之间的时间。有几种方法可以解决这个问题。网页完美地总结了它们。这是一种参考

我做了一个快速的代码修改来给你一些指导。代码适用于Linux,但也应适用于Visual Studio

#include <SFML/Graphics.hpp>
#include <iostream>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    window.setFramerateLimit(60);

    // Timing
    sf::Clock clock;

    while (window.isOpen())
    {
        // Update the delta time to measure movement accurately
        sf::Time dt = clock.restart();

        // Convert to seconds to do the maths
        float dtAsSeconds = dt.asSeconds();

        // For debuging, print the time to the terminal
        // It illustrates the differences
        std::cout << "Time step: " << dtAsSeconds << '\n';

        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

谢谢你的回答!它起作用了!我以前放弃过这种解决方案,因为它在我的其他项目中也能正常工作。有人知道为什么吗?默认情况下是否有帧限制?我可能错误地停用了?无论如何,非常感谢!我的荣幸!代码中缺少setFramerateLimit。您可以尝试一下,SFML将通过在draw调用后应用sleep来尝试匹配帧速率限制。我总是同时使用时间步长和setFramerateLimit。