slENDer12

На Пикабу
Дата рождения: 22 сентября
1120 рейтинг 1 подписчик 26 подписок 2 поста 0 в горячем
Награды:
5 лет на Пикабу
4

GC опять виноват? Устраняем пролаги эффективно

Каждый Unity разработчик сталкивался с тем, что в его игре происходят периодические пролаги. Обычно это происходит из-за того, что программист при написании игровой системы мало заботился о рациональном использовании памяти и это приводило к проблемам с Garbage Collector.

Garbage Collector частая причина пролагов

Когда нужно создать какой-нибудь массив или List, под него будет выделена память. Если потом этот объект не будет использоваться, то им займётся Garbage Collector (GC). Он следит, за всеми объектами и, если объект становится не нужен, то GC освобождает память, которая использовалась объектом. Если создавать много таких объектов, а потом сразу переставать использовать, то у игрока появятся видимые пролаги, в моменты, когда GC освобождает память.

Одноразовые коллекции приводят к нагрузке на Garbage Collector

Ниже пример кода, который оставляет в словаре только те элементы, которые есть в массиве. В момент создания HashSet происходит аллокация и, если такая функция вызывается часто, то появятся проблемы.

GC опять виноват? Устраняем пролаги эффективно Gamedev, Разработка, Unity, Программирование, Компьютерные игры, IT, Туториал

Кешируй одноразовые коллекции

Есть много способов исправить эту проблему, начиная от переделки алгоритма и, заканчивая кешированием коллекций. Ниже, самый простой вариант, когда коллекция выносится из функции, в таком случае аллокация произойдёт только один раз:

GC опять виноват? Устраняем пролаги эффективно Gamedev, Разработка, Unity, Программирование, Компьютерные игры, IT, Туториал
Показать полностью 1
Отличная работа, все прочитано!