Список на самом деле имеет встроенную емкость для предотвращения выделения для каждого добавления / удаления. Как только вы превышаете емкость, это добавляет больше (я думаю, что я удваиваюсь каждый раз). Проблема может быть скорее в удалении, чем в добавлении. Добавить будет просто на первом открытом месте, которое отслеживается по размеру. Чтобы удалить, список должен быть сжат, чтобы заполнить теперь пустой слот. Если вы всегда удаляете переднюю часть списка, то каждый элемент должен скользить вниз.
Стек все еще использует массив в качестве внутреннего механизма хранения. Таким образом, вы все еще связаны со свойствами добавления / удаления массива.
Чтобы массив работал, вам нужно создать все маркеры с активным свойством для каждого. Когда вам нужен новый, заполните флаг Active на true и установите все новые свойства маркеров. По завершении установите активный флаг false.
Если вы хотите попытаться исключить необходимость повторения списка (который может быть очень большим в зависимости от того, что вы собираетесь разрешить) для каждого перерисовывания, вы можете попытаться реализовать двойной связанный список в массиве. Когда требуется новая пуля, запросите массив для первой доступной бесплатной записи. Перейдите к последнему активному маркеру (переменная) и добавьте новую позицию массива маркера в его следующее свойство активного маркера. Когда пришло время удалить его, перейдите к предыдущему маркеру и измените его свойство активного маркера на удаленный следующий активный.
//I am using public fields for demonstration. You will want to make them properties
public class Bullet {
public bool Active;
public int thisPosition;
public int PrevBullet = -1;
public int NextBullet = -1;
public List<Bullet> list;
public void Activate(Bullet lastBullet) {
this.Active = true;
this.PrevBullet = lastBullet.thisPosition;
list[this.PrevBullet].NextBullet = this.thisPosition;
}
public void Deactivate() {
this.Active = false;
list[PrevBullet].NextBullet = this.NextBullet;
list[NextBullet].PrevBullet= this.PrevBullet;
}
}
Таким образом, у вас есть готовый массив со всеми необходимыми маркерами, но краска попадает только в активные маркеры, независимо от их положения в массиве. Вам просто нужно сохранить ссылку на первый активный маркер, чтобы начать рисовать, и последний активный маркер, чтобы знать, где список начинается заново.
Теперь вы просто беспокоитесь о том, чтобы память содержала весь список, а не когда GC будет очищаться.