gpt4 book ai didi

c++ - 为了多态性而指向 vector 的指针 - C++

转载 作者:太空狗 更新时间:2023-10-29 21:22:27 25 4
gpt4 key购买 nike

我正在开发一个基于 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)

但这似乎非常低效,并且必须考虑随着游戏的进行而不断变化的实体数量。我对数据结构的基础知之甚少;所以这可能是一个愚蠢的问题,但我希望能提供一些见解。

最佳答案

与绘制图形的成本相比,您显示的 for 循环中的复制操作可能非常快,以至于无法衡量。您可以通过执行 Entities.resize(...) 使其更快在循环之前并在循环中使用数组索引。

您在问题第一部分提出的解决方案将不起作用,因为 vector<StaticEntity> 的数据布局可能与 vector<DynamicEntity> 的布局不同.对象数组不是多态的,存储由 vector<> 管理本质上是一个数组,周围有一些动态管理。

其实因为 vector 存储是类数组的,如果把push_back换成使用数组索引,for 的主体循环将编译成类似的东西:

*p1++ = p2++;

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

关于c++ - 为了多态性而指向 vector 的指针 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20591093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com