指向向量的指针用于多态性 - C++

3
我正在开发一个基于OpenGL的游戏,我在寻找一种稳健的方式将实体信息传递给渲染和网络功能。类似这样的方法:
vector <DynamicEntity> DynamicEntities;
vector <StaticEntity> StaticEntities;

vector <Entity> *Entities;

Entities.push_back(&DynamicEntities);
Entities.push_back(&StaticEnt);

Graphics.draw(Entities);
Server.bufferData(Entities);

Graphics.draw和Server.bufferData需要的唯一信息都包含在Entity中,DynamicEntity和StaticEntity都继承自它。

我知道这样可以工作:

vector <Entity*> Entities;
for(uint32_t iEntity=0;iEntity<iNumEntities;iEntity++)
{
    Entities.push_back(&DynamicEntities[iEntity])
}
//(ad nauseam for other entity types)

但这似乎非常低效,并且必须考虑随着游戏进展而改变的实体数量。我对数据结构的基础知识了解相对较少,因此这可能是一个愚蠢的问题,但我希望能得到一些见解。

1个回答

3
那个for循环中的复制操作可能比绘图成本快得多,以至于无法测量。在循环中执行Entities.resize(...)并在循环中使用数组索引可能会使它更快。
你在问题的第一部分提出的解决方案行不通,因为vector<StaticEntity>的数据布局与vector<DynamicEntity>的布局可能不同。对象数组不是多态的,并且由vector<>管理的存储基本上是一个带有一些动态管理的数组。
事实上,由于向量存储类似于数组,如果用数组索引替换push_back,则for循环的主体将编译为类似以下内容的东西:
*p1++ = p2++;

编译器甚至可以自动向量化!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接