我应该在 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;
}
(我是 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;
}