为什么轮询事件循环会减慢我的程序速度



所以,我正试图为一个大学项目制作一个2d平台游戏,我想在设置菜单上设置文本字段,以使用TextEntered事件设置游戏所需的键绑定。当我在一个分离的main上尝试TextField类时,一切都很好,但当我试图将其放在Settings类中时,文本的识别速度非常慢(甚至在我按下某个键几秒钟后(。有没有一种方法可以处理类内的事件,这种方法不同于包含主循环的类,而不会减慢所有事情的速度?这是轮询事件循环,用于检查Settings类中输入的文本:

sf::Event event{};
while (window->pollEvent(event)) {
for (auto &t : textFields) {
if (t.second->contains(mousePos)) {
if (event.type == sf::Event::TextEntered) {
if (event.text.unicode < 128) {
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
t.second->addString("Space");
else {
// Convert to uppercase
sf::String string =
static_cast<sf::String>(event.text.unicode);
std::transform(string.begin(), string.end(),
string.begin(), ::toupper);
t.second->addString(string);
}
t.second->setString();
}
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::BackSpace)) {
t.second->clear();
}
}
}
}

首先要做的是查看代码结构。事实上,这是非常低效的。好吧,这将适用于大量的文本字段:

while (window->pollEvent(event)) { // for each event
for (auto &t : textFields) { // for each text field
if (t.second->contains(mousePos)) { // check position
if (event.type == sf::Event::TextEntered) { // is it a text entered event

这将使您在任何时候都为每个文本字段检查一组位置,即使它不是正确的类型。

至少,您需要将其更改为:

while (window->pollEvent(event)) { // for each event
if (event.type == sf::Event::TextEntered) { // is it a text entered event
for (auto &t : textFields) { // for each text field
if (t.second->contains(mousePos)) { // check position

然后,只有当您有一个文本输入事件时,才对文本字段进行迭代。

最新更新