【发布时间】:2018-11-07 23:14:30
【问题描述】:
我为游戏中的每个实体都有一个类,它有一个子类用于管理该实体的某些属性。 属性管理类拥有一个 std::list 结构,每个结构都有关于单个属性的数据和一些简单的函数来操作该数据。 这里有一些伪代码来说明它:
struct stAttribute
{
/* data & functions */
}
class AttributeManager
{
std::list<struct stAttribute> attributeList;
/* ... */
};
class Entity
{
AttributeManager attribMgr;
/* .... */
};
int main(void)
{
Entity ent;
struct stAttribute newAttrib;
/* ... */
ent.attribMgr.attributeList.push_back(x);
return EXIT_SUCCESS;
}
实体在游戏运行时经常被创建和删除,属性也是如此。
我开始怀疑“静态”创建它们并将整个结构保留在列表中是否是一个不错的选择。我主要关心的是性能。 动态分配内存并仅存储指向结构的指针会更好吗?释放内存没有任何问题,因为属性的删除是由 AttributeManager 类处理的。
【问题讨论】:
-
从 cppcon 2018 看看这个; youtube.com/watch?v=yy8jQgmhbAU 详细了解程序结构的影响,OOP v Data Oriented Design。有见地的谈话。
-
你不想要
std::list。我能想到使用std::list的唯一“好”原因是如果您想要指向列表元素的稳定指针,这不是一个好理由,这是一个坏理由。使用矢量。 -
写两个,然后配置文件。也就是说,保罗的回答是正确的。在多态性之外的
std::list中很少需要指针,因为列表具有非常宽容的迭代器失效。list的缓存和分支预测友好性也很差,因此您可能需要将std::vector混入其中,以查看其 O(1) 访问和缓存友好性,同时迭代优势超过 O(N) 劣势删除一个元素。