Функция yield return в C # создает для меня много мусора. Можно ли помочь?

Я разрабатываю игру для 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, но этот комментатор был более отзывчивым и предложил создать пул итераторов. Это решение, которое я собираюсь использовать.

6
задан Community 23 May 2017 в 12:06
поделиться