我正在开发基于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.rad和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)
但这看起来非常低效,并且随着游戏的进行必须考虑到实体数量的变化。我知道数据结构的基础相对较少;所以这可能是一个愚蠢的问题,但我会很感激一些见解。
答案 0 :(得分:3)
与绘制图形的成本相比,您显示的for循环中的复制操作可能非常快,无法测量。您可以通过在循环之前执行Entities.resize(...)
并在循环中使用数组索引来使其更快。
您在问题的第一部分中提出的解决方案将无效,因为vector<StaticEntity>
的数据布局可能与vector<DynamicEntity>
的布局不同。对象数组不是多态的,vector<>
管理的存储本质上是一个数组,周围有一些动态管理。
事实上,因为向量存储是类似数组的,如果用数组索引替换push_back
,for
循环的主体将编译为类似的东西:
*p1++ = p2++;
编译器甚至可以自动矢量化!