我已经制作了一个2D游戏引擎,但我在质疑我做事的一种方式是否是结构上做事的最佳方式。例如,Sprite的成员可以有多个Graphic成员。现在我将这些成员保留在vector<const Graphic*>
(不是std::vector
,但为了简单起见,我会在示例中使用它):
class Sprite {
private:
std::vector<const Graphic*> _graphicList;
public:
Sprite();
~Sprite();
void addGraphic(const Graphic* toAdd); //adds a const Graphic* to _graphicList
void draw() const; //draws all items in _graphicList
};
以上示例运行正常。问题是,我需要将我的Graphic对象保留在此范围内才能工作。这会产生错误:
void foo (bool redCircle) {
Sprite sprCircle;
if(redCircle) {
Graphic gfxRedCircle("redCircle.bmp");
sprCircle.addGraphic(&gfxRedCircle);
}
else {
Graphic gfxBlueCircle("blueCircle.bmp");
sprCircle.addGraphic(&gfxBlueCircle);
}
sprCircle.draw(); //would possibly not work, since the Graphic is out of scope
}
我可以创建副本:
class Sprite {
private:
std::vector<Graphic> _graphicList;
public:
Sprite();
~Sprite();
void addGraphic(Graphic& toAdd); //adds a Graphic to _graphicList
void draw() const; //draws all items in _graphicList
};
然而,如果我将Graphic保留在范围内,这将浪费宝贵的记忆。
所以我想我的问题可以归结为:
在游戏引擎中,更重要的是:健壮性还是有效的内存使用?
答案 0 :(得分:1)
如果你的对象超出范围,任何通过指针或引用使用它的尝试都有C ++语言标准的未定义行为(意思是,它可能会破坏其他一些对象,或者它可能会使程序崩溃,或者杀死你的猫最令人毛骨悚然的方式)。因此,如果该对象应在范围内 - 必须,这不是一个问题!
同样,稳健性是您不想为任何事情进行交易的品质。如果您的程序崩溃,用户将不关心它使用的内存有多少。要优化内存使用的程序,你应该仔细考虑很多因素 - 你的程序使用大多数内存,如何降低这种使用,以及你可以提取哪些技巧以使你的内存占用降低(例如通过缓存和大量重用现有对象)。这些因素中的每一个都严重依赖于您的特定程序,因此一般来说讨论它对您的特定目的几乎没有用。
答案 1 :(得分:0)
正确性应该是首要考虑因素。使用超出范围对象肯定是错误的,您的程序可以中止/挂起(未定义的行为)。
有一些方法,取决于你需要什么:
void addGraphic(const Graphic &toAdd);
这可能意味着如果Graphic对象包含指针并且您想要完美克隆它(不仅仅是指同一个内存),则需要实现深层复制/复制构造函数操作。如果你没有做深刻的复制,原始对象可能会被释放,你仍然会引用释放的内存。
void addGraphic(const string &bmpName);
只需在addGraphic中自己创建Graphic对象然后放入向量中,这样你就拥有了对象,它不会超出范围。