Подтвердить что ты не робот

С# и .Net Производительность сборщика мусора

Я пытаюсь создать игру на С# и .NET, и я планировал реализовать сообщения, которые обновляют игровые объекты в игровом мире. Эти сообщения будут ссылочными объектами С#.

Мне нужен такой подход, потому что делать это таким образом было бы проще отправить их по сети, если я хочу, чтобы игра была многопользовательской.

Но если у меня будет много сообщений, разве это не будет очень напряженным для сборщика мусора? И не повлияет ли это на геймплей? Сам класс сообщений довольно мал с 4 или 5 членами не более.

Эти сообщения будут генерироваться пару раз в секунду для каждого объекта в игровом мире.

4b9b3361

Ответ 1

GC в более поздних версиях, но более точно 4.5, выполняется асинхронно для поколений уровня 0 и 1. Это значительно уменьшило влияние GC.

Если ваши объекты недолговечны, они не должны переходить с уровня поколений 0 большую часть времени. Уровень 0 - это самое быстрое поколение для очистки GC.

В нижней строке, я бы не подумал о преждевременной оптимизации моего кода, опасаясь производительности GC.

Преждевременная оптимизация - это корень всего зла  DonaldKnuth

Лично я бы рекомендовал эту статью для более глубокого понимания

Ответ 2

В .NET сборщик мусора имеет 3 поколения, поколение 0, поколение 1 и поколение 2. Каждый раз, когда GC не может собрать объект в поколении, этот объект будет продвигаться в следующее поколение.

Вы можете столкнуться с проблемами, если ваши объекты больше 85 КБ. Эти объекты будут автоматически сохранены в большой куче объекта. Куча больших объектов будет автоматически собрана в следующих ситуациях:

  • Выделения превышают порог больших кучи объектов.
  • Система находится в ситуации с низкой памятью.
  • System.GC.Collect вызывается при генерации 2.

Проблема заключается в том, что при сборке большой кучи объекта память для объектов освобождается, но LOH не уплотняется. Поскольку LOH фрагментирован, вы можете получить SystemOutOfMemory исключение, если не будет достаточно места для вашего объекта на LOH.

Такие методы, как объединение объектов, обычно используются для повышения производительности LOH. http://en.wikipedia.org/wiki/Object_pool_pattern

Источник: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

UPDATE:.Net 4.5.1 позволит вам выполнять уплотнение LOH по требованию с помощью API GC.Collect.