Я разрабатываю игру для Xbox 360 с XNA. Я бы действительно хотел использовать конструкцию C # yield return
в нескольких местах, но, похоже, она создает много мусора. Взгляните на этот код:
class ComponentPool where T : DrawableGameComponent
{
List preallocatedComponents;
public IEnumerable Components
{
get
{
foreach (T component in this.preallocatedComponents)
{
// Enabled often changes during iteration over Components
// for example, it's not uncommon for bullet components to get
// disabled during collision testing
// sorry I didn't make that clear originally
if (component.Enabled)
{
yield return component;
}
}
}
}
...
Я использую эти пулы компонентов везде - для пуль, врагов, взрывов; ничего многочисленного и преходящего. Мне часто нужно перебирать их содержимое, и меня всегда интересуют только активные компоненты (например, Enabled == true
), отсюда и поведение свойства Components
.
В настоящее время я наблюдаю около 800 КБ дополнительного мусора в секунду при использовании этой техники. Можно ли этого избежать? Есть ли другой способ использовать yield return
?
Изменить: Я нашел этот вопрос о более широкой проблеме, как перебирать пул ресурсов без создания мусора. Многие комментаторы были пренебрежительно, очевидно, не понимая ограничений Compact Framework, но этот комментатор был более отзывчивым и предложил создать пул итераторов. Это решение, которое я собираюсь использовать.