我需要选择一个容器来存储指向我定义的类型(Particle
)的指针。我正在使用预分配的 Particle 对象池
(其中包含预分配在 std::vector 上的对象)。
我的粒子发射器在需要发射时向粒子池请求粒子(以避免游戏中的粒子分配)。当粒子过期时,它将返回到 Particle 对象池。
正如您所看到的,当我迭代通过粒子参考容器(需要选择一个)以进行更新时,我必须检查哪些粒子已过期(lifetime <= 0.0
)并将其返回到粒子池,过期的粒子可能在容器中的任何位置。
我一直在思考使用 std::list
,以下是原因:
列表(据我所知)提供了在开头插入和在任何点上删除的常数时间(假设您已经迭代到该点)。
欢迎就如何更好地适应您的容器建议提出任何建议或改进。
编辑:
为了更好地解释自己:
发射器中粒子的寿命不完全相同,它取决于一个范围,例如,5.0秒+-(0.0到0.5)。这是为了给粒子一种随机性的元素,看起来比所有粒子都在相同时间更好。
算法伪代码:
// Assume typedef std::container_type<Particle *> ParticleContainer
void update(float delta)
{
ParticleContainer::iterator particle = m_particles.begin();
for(; particle != m_particles.end(); ++particle)
{
updateParticle(*particle, delta); //Update the particle
if ( (*particle)->lifeTime <= 0.0 )
{
ParticlePool.markAsFree(*particle); //Mark Particle as free in the object Pool
m_particles.remove(*particle); //Remove the Particle from my own ParticleContainer
}
}
}
std::vector
。然后进行性能测试,如果容器操作成为问题,请尝试其他容器。通常情况下,您会发现自己仍然坚持使用std::vector
。 - sbi