我应该在 C++ (SFML) 中缓存这个对象吗?

Should I cache this object in c++ (SFML)

(我是 c++ 的新手,但我有 c# 和 java 的经验)

嗨,我正在用 C++ (SFML) 创建一个国际象棋游戏,我有一个棋子 class,它有绘制方法。现在我是这样做的:

void Piece::draw(sf::RenderWindow& p_window, bool p_selected) {
    if (p_selected) {
        sf::RectangleShape shape;
        shape.setFillColor(sf::Color(190,235,127));
        shape.setOutlineColor(sf::Color(221,237,142));
        shape.setOutlineThickness(3);
        shape.setSize(sf::Vector2f(80,80));
        shape.setPosition(sprite.getPosition());
        p_window.draw(shape);
    }

    p_window.draw(sprite);
}

如果选择了棋子,我创建 RectangleShape(让玩家知道选择了什么棋子),设置它的属性然后绘制它。

这样做的好方法吗? 或者我应该缓存具有设置属性的 RectangleShape 并将其位置更新为选定的块位置?

如果我错过了重要的事情,请告诉我,感谢您的回答。

实际上,与不缓存 sf::RectangleShape 相比,缓存对性能的影响很小,尤其是对于象棋游戏这样相对简单的程序。不过,一般来说,缓存每帧重复使用的变量而不是一遍又一遍地创建它们是个好主意。我决定使用您提供的代码编写一个小型测试用例,以衡量超过 10,000 次绘制调用的性能差异。结果是性能提高了大约 23%(1518 毫秒对 1030 毫秒。)这是我使用的代码,您可以自己测试它:

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

class Test {
public:
    static sf::RectangleShape rect;

    Test() {
        rect.setFillColor(sf::Color(190, 235, 127));
        rect.setOutlineColor(sf::Color(221, 237, 142));
        rect.setOutlineThickness(3);
        rect.setSize(sf::Vector2f(80, 80));
        rect.setPosition(0, 0);
    }

    void drawNoCache(sf::RenderWindow& p_window) {
        sf::RectangleShape shape;
        shape.setFillColor(sf::Color(190, 235, 127));
        shape.setOutlineColor(sf::Color(221, 237, 142));
        shape.setOutlineThickness(3);
        shape.setSize(sf::Vector2f(80, 80));
        shape.setPosition(0, 0);
        p_window.draw(shape);
    }


    void drawWithCache(sf::RenderWindow& p_window) {
        p_window.draw(rect);
    }
};

sf::RectangleShape Test::rect;

int main() {
    sf::RenderWindow window(sf::VideoMode(80, 80), "SFML");
    Test t;
    sf::Clock clock;
    clock.restart();
    for (int i = 0; i < 10000; i++) {
        window.clear(sf::Color(0, 0, 0));
        t.drawNoCache(window);
        window.display();
    }
    std::cout << clock.restart().asMilliseconds() << std::endl;
    for (int i = 0; i < 10000; i++) {
        window.clear(sf::Color(0, 0, 0));
        t.drawWithCache(window);
        window.display();
    }
    std::cout << clock.restart().asMilliseconds() << std::endl;
}