【问题标题】:sf::Font::loadFromFile crashing the programsf::Font::loadFromFile 使程序崩溃
【发布时间】:2016-03-31 17:14:31
【问题描述】:

我最近一直在测试 SFML 2.3 中的一些功能,并且我已经开始熟悉 C++。 玩了一圈之后,我决定尝试在程序中添加文本,使用sf::Textsf::Font

这样做后,我在运行程序时遇到了问题,即使使用它的教程也是如此。

我已经尝试调试它,但没有看到任何问题,但是在运行时,关于它绘制“文本”的点,出现一个对话框,说“text.exe 已停止工作”

我正在运行 Windows 10 10586,并且我正在使用 VS2012 Professional。

我有下面的代码,目前为止。

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

int main()
{
    sf::RenderWindow window(sf::VideoMode(800,600),"Text Test");
    sf::Text text;
    sf::Font font;
    std::cout << "Created the Window." << std::endl;
    std::cout << "Loaded Text and Font classes" << std::endl;

    while (window.isOpen())
    {
        sf::Event event;
        std::cout << "Created window Function loop" << std::endl;

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

        if (!font.loadFromFile("arial.ttf"))
        {
            std::cout << "Program Halted." << std::endl;
            std::exit(-1);
        }

        std::cout << "Loaded Fonts." << std::endl;
        text.setFont(font);
        text.setString("I am a Test");
        text.setCharacterSize(20);

        window.clear();
        window.draw(text);
        window.display();
    }
    return 0;
}

【问题讨论】:

  • 最好将加载字体和初始化sf::Text对象的代码移出主处理循环。这应该每秒执行很多次。
  • @Henry 与其在标题中添加(Solved),不如接受您最喜欢的答案。这就是我们在这里的做法。
  • 我听说过,但因为我得到的答案基本相同,我不能说一个比另一个好。所以我宁愿告诉人们它已经“解决了”,而不是得到更多的答案,或者让它变得更复杂,或者成为一个重复的答案。
  • @HenrySouthall 因为答案基本相同,所以我撤回了我的答案,让您的选择更容易:)

标签: c++ windows crash sfml


【解决方案1】:

你正在这样做:

font.loadFromFile("arial.ttf")

在没有延迟的循环中。字体应该在程序启动时加载一次,否则操作系统和您的防病毒软件将不喜欢您的程序正在执行的操作(重复访问磁盘上的同一文件太长时间)。

关于延迟,你应该有:

window.setVerticalSyncEnabled(true);

与 60FPS 同步(可能),因为你也在最大化 CPU 线程/GPU。

生成的代码,删除了一些非描述性的输出消息:

int main()
{
    sf::RenderWindow window(sf::VideoMode(800,600),"Text Test");
    window.setVerticalSyncEnabled(true);
    std::cout << "Created the Window." << std::endl;

    sf::Text text;
    sf::Font font;

    if (!font.loadFromFile("arial.ttf"))
    {
        std::cout << "Program Halted." << std::endl;
        std::exit(-1);
    }

    std::cout << "Loaded Fonts." << std::endl;
    text.setFont(font);
    text.setString("I am a Test");
    text.setCharacterSize(20);

    while (window.isOpen())
    {
        sf::Event event;

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

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

    return 0;
}

【讨论】:

  • 谢谢,现在一切正常。我确实故意放入了非描述性的,因为我真的很困惑为什么它不起作用,所以我决定“标记”大多数功能以发现错误。
  • 好吧,我很奇怪检查 textfont 是否已构建。没有什么可以失败的。
猜你喜欢
  • 2016-04-23
  • 2018-01-06
  • 2012-05-04
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多