Мне нужно выбрать контейнер для хранения указателей на тип, который я определил (Particle
). Я использую предварительно выделенную частицу Object Pool
(которая содержит объекты, предварительно выделенные на std::vector ).
Мои излучатели частиц запрашивают у пула частиц частицы, когда им нужно излучать (чтобы избежать распределения частиц в игре). Когда срок действия частицы истекает, она возвращается в пул объектов частиц.
Как видите, по мере того, как я перебираю контейнер эталонных частиц (нужно выбрать один), чтобы обновить его, мне нужно будет проверить, срок действия каких частиц истек (lifetime <= 0.0
), и вернуть их обратно в пул частиц, просроченные частицы могут быть в любом положении в контейнере.
Я думал об использовании std::list
, вот почему:
Список (AFAIK) обеспечивает вставку с постоянным временем в начале и удаление с постоянным временем в любой точке (при условии, что вы выполнили итерацию до этой точки).
Приветствуются любые предложения или улучшения моей системы, чтобы лучше соответствовать вашим предложениям по контейнерам.
ИЗМЕНИТЬ:
Чтобы объяснить себя немного лучше:
Время жизни частиц в эмиттере не точно такое же, оно зависит от диапазона, например, 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
.< /а> - person sbi   schedule 10.03.2011