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



(我对c++完全陌生,但我有c#和java的经验)

嗨,我正在用c++ (SFML)创建一个国际象棋游戏,我有一个具有draw方法的Piece类。现在我是这样做的:

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(让玩家知道哪个棋子被选中了),设置它的属性,然后绘制它。

这是一个好方法吗?或者我应该缓存矩形与设置属性,只是更新其位置,以选定的块的位置?

如果我错过了什么重要的东西,请告诉我,谢谢你的回答。

实际上,缓存与不缓存sf::RectangleShape对性能的影响很小,特别是对于一个相对简单的程序,如国际象棋游戏。一般来说,缓存每帧重复使用的变量而不是一遍又一遍地创建它们是一个好主意。我决定使用您提供的代码编写一个小测试用例,以测量10,000个draw调用的性能差异。结果是大约23%的性能提升(1518ms vs 1030ms)。下面是我使用的代码,您可以自己测试:

#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;
}

相关内容

  • 没有找到相关文章

最新更新