Я пишу симуляцию, которая имеет цикл обновления, который называется каждым фреймом. В функции обновления у меня есть миллионы объектов для обновления, так что это выглядит так.C# как уменьшить сбор мусора
public void Update(float deltaTime)
{
Time += deltaTime;
foreach (SimulationObject obj in objects.ToArray())
obj.Update(deltaTime);
}
where objects is
List<SimulationObject> objects = new List<SimulationObject>();
and is populated at program initialization time.
Вы можете, вероятно, увидеть objects.ToArray() делает копию этого огромного списка каждый кадр, то копия получает сборщик мусора. Это вызывает огромную производительность для меня. Для пробега около 2 минут собранный мусор достигает около 2G. Поскольку список этих объектов асинхронно модифицируется в фоновом режиме некоторой сторонней библиотекой, кажется, что я не могу удалить ToArray().
Мне интересно, если есть хороший способ уменьшить сбор мусора, избегайте копирования или повторного использования выделенного пространства?
Я новичок в C# и попытался найти ответы, но не смог. Если это дублированный пост, я приношу свои извинения.
FYI .ToArray() делает копию коллекции, хотя объекты в коллекции не копируются http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs, 783a052330e7d48d – Eminem
См. Ответ на: [Предотвратите сборку мусора в течение короткого периода времени] (http://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time) – Eminem
@Eminem - предполагается, что 'SimulationObject' - это' class' (ссылочный тип), а не 'struct' (тип значения). – Corak