我正在用C ++编写游戏,并且遇到了这个设计问题:
我为游戏中的所有对象都有一个名为Entity
的基类。为了使用继承,我将指针存储在octree
中。在我的游戏中,有些对象将由其他对象的方法创建。问题是:我可以在哪里存储以此方式创建的对象,以便在游戏过程中保持存在,以便存储的指针有效?
我不想使用new
,因为我将以这种方式创建大约数百甚至数千个对象,而且我听说new
非常慢。
到目前为止,我提出的唯一方法是拥有一个存储所有这些对象的大向量。该向量可能会被初始化为一个巨大的大小,因此它不必调整自身大小并弄乱我的指针。不过,这似乎很愚蠢。
答案 0 :(得分:1)
第一:不要太担心性能。遵循一些基本规则,您会没事的:
您的项目最重要的事情是:考虑结构和设计
关于您的具体问题: 最好有一个“ ObjectManager”类。作为第一个实现,矢量也是可以的,只需将其隐藏为实现的详细信息,以便稍后在需要时进行更改。
答案 1 :(得分:0)
一种改进new
的方法是为对象定义custom allocators,该对象利用有关类的知识来编写比标准类更好的新类。
好消息是,您可以立即使用new
编写代码,然后再创建自定义分配器。因此,不要迷失于过早优化的危险中,也就是说,我们都知道:
过早的优化是万恶之源
-唐纳德·克努斯(Donald Knuth)
如果Entity
是所有对象的基类,那么我想您将大量使用多态。不幸的是,由于slicing的问题,您无法轻松地管理矢量中的多态对象(这将是更方便,更安全的方法)。因此,在这种情况下,指针是可以的。也许您可以考虑使用shared_ptr
来避免内存泄漏。
话虽这么说,您可能对this article感兴趣,涉及游戏中的实体组件系统模式以及内存分配。