cod*_*373 0 c++ dictionary vector
我正在尝试为我正在制作的游戏创建一个实体管理器,这样我就可以轻松管理游戏中的所有实体(玩家,敌人,对象)并能够调用他们的更新和渲染功能,而无需手动执行.我正在使用一个接收int和Entity类的映射来记录实体
std::map<int, Entity*> entities;
Run Code Online (Sandbox Code Playgroud)
每当实体被添加到地图中时,它们也将被赋予随机ID,该ID被添加到向量中,这样我就可以记录已使用的ID,因此我最终不会使用完全相同的实体
IDS = std::vector<int>();
void EntityManager::AddEntity(Entity* entity)
{
int ID = rand();
for(int i = 0; i < IDS.size(); i++)
{
if(IDS[i] == ID)
{
ID = rand();
i = 0;
}
}
entities.insert(pair<int, Entity*>(ID, entity));
}
Run Code Online (Sandbox Code Playgroud)
然后我最后调用每个实体的Update和Render函数
void EntityManager::Update(float deltaTime)
{
if(!entities.empty())
{
for(int i = 0; i < entities.size(); i++)
{
if(entities[i] != nullptr)
{
entities[i]->Update(deltaTime);
}
}
}
}
void EntityManager::Render()
{
if(!entities.empty())
{
for(int i = 0; i < entities.size(); i++)
{
if(entities[i] != nullptr)
{
entities[i]->Render();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是当我在Update和Render函数中检查地图的大小时,帧速率会立即下降到2FPS,大小类似于16587而不是它应该是什么这只是2,我只在地图中输入2个实体.我试图找出原因是什么但是我找不到它,在AddEntity函数中的"entities.insert"之后大小为2但是一旦调用了Update和Render函数,大小立即变为16587或类似的数字.除了在另一个类中的构造函数中,我不会在其他地方调用AddEntity:
entityManager->AddEntity(player);
entityManager->AddEntity(diamond);
Run Code Online (Sandbox Code Playgroud)
entities是一个map,你使用随机整数作为关键.您不能使用索引循环来访问地图成员.该循环的每次迭代都会在地图中添加另一个条目(带有a nullptr Entity),增加大小会导致循环继续.
要通过地图迭代,您可以使用
for (const auto &ent: entities)
ent.second->Render();
Run Code Online (Sandbox Code Playgroud)
那么你只会看到地图中的条目而不添加任何新条目.