Альтернатива C# Parallel.ForEach, которая не выделяет память (для геймдева)?C#

Место общения программистов C#
Anonymous
Альтернатива C# Parallel.ForEach, которая не выделяет память (для геймдева)?

Сообщение Anonymous »

TLDR: Есть ли способ сделать то, что делает Parallel.ForEach, но без выделения в куче?
Я разрабатываю игру с процедурно генерируемым миром во время выполнения. Каждый логический уровень мира генерируется порциями, и я использую Parallel.ForEach для параллельного выполнения этих вычислений порций. Это ресурсоемкая работа, для которой, как я понимаю, создан Parallel.ForEach, и он работает очень хорошо.
За исключением того, что он распределяет память в куче, что плохо в контексте разработки игр, поскольку это означает, что в конечном итоге произойдет сборка мусора. Сбор мусора обычно занимает много времени (у меня более 100 мс, когда это происходит), что приводит к заиканию частоты кадров, поэтому этого следует избегать любой ценой. Обычной лучшей практикой при разработке игр на Unity является избегание выделений (за исключением тех, которые никогда не выпускаются), например, путем использования структур вместо классов или использования пулов переработанных объектов вместо создания новых.
Я не очень хорошо разбираюсь во внутренней работе Parallel.ForEach, но по профилировщику Unity я вижу, что он выполняет целую кучу выделений разных типов.
Мне интересно есть ли сторонняя библиотека или подобная, которая может выполнять аналогичную работу, но без выделения? Или для этого можно использовать другую технику, встроенную в C#?
Для тех, кто знает Unity, знайте, что я не могу использовать систему заданий Unity, поскольку она позволяет создавать новые потоки только из основного потока. Мне нужно иметь возможность создавать их где угодно, так как моя архитектура рекурсивная — куски в одном слое зависят от кусков в другом слое и обеспечивают их создание и так далее. Более того, в документации системы Unity Job прямо указано, что не следует использовать ее для длительных заданий, как это делаю я.
Кто-то предлагал использовать UniTask, но мне кажется, что она предназначена для другого варианта использования.
Есть какие-нибудь советы?

Вернуться в «C#»