Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

При планировании заданий может быть только одно задание, выполняющее одну задачу. В игре часто требуется выполнить одну и ту же операцию с большим количеством объектов. Для этого существует отдельный тип задания с именем IJobParallelFor.

Примечание. Задание «ParallelFor» — это собирательный термин в Unity для любой структуры, реализующей интерфейс IJobParallelFor.

Задание ParallelFor использует NativeArray данных в качестве источника данных. Задания ParallelFor выполняются на нескольких ядрах. На каждое ядро ​​приходится одно задание, каждое из которых обрабатывает подмножество рабочей нагрузки. IJobParallelFor ведет себя как IJob, но вместо одного Execute, он вызывает метод Execute один раз для каждого элемента в источнике данных. В методе Execute есть целочисленный параметр. Этот индекс предназначен для доступа и работы с одним элементом источника данных в рамках реализации задания.

Пример определения задания ParallelFor:

struct IncrementByDeltaTimeJob: IJobParallelFor { public NativeArray values; public float deltaTime; public void Execute (int index) { float temp = values[index]; temp += deltaTime; values[index] = temp; } }

Планирование заданий ParallelFor

При планировании заданий ParallelFor необходимо указать длину источника данных NativeArray, который вы разделяете. Система заданий Unity C# не может знать, какой NativeArray вы хотите использовать в качестве источника данных, если в структуре их несколько. Длина также сообщает системе заданий C#, сколько методов Execute следует ожидать.

За сценамиСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Посмотрите в Словарь
, что планирование заданий ParallelFor более сложное. При планировании заданий ParallelFor система заданий C# делит работу на пакеты для распределения между ядрами. Каждый пакет содержит подмножество методов Execute. Затем система заданий C# планирует до одного задания в собственной системе заданий Unity для каждого ядра ЦП и передает это собственное задание несколькими партиями для завершения.

Задание ParallelFor, разделяющее пакеты между ядрами
Задание ParallelFor, разделяющее пакеты между ядрами

Когда собственное задание завершает свои пакеты раньше других, оно крадет оставшиеся пакеты у другого собственного задания. рабочие места. Он крадет только половину оставшихся пакетов собственного задания за раз, чтобы обеспечить место кэширования.

Чтобы оптимизировать процесс, необходимо указать количество пакетов. Счетчик пакетов определяет, сколько заданий вы получаете и насколько точным является перераспределение работы между потоками. Небольшое количество пакетов, например 1, обеспечивает более равномерное распределение работы между потоками. Это сопряжено с некоторыми накладными расходами, поэтому иногда лучше увеличить количество пакетов. Допустимой стратегией является начинать с 1 и увеличивать количество пакетов до тех пор, пока не будет незначительного прироста производительности.

Пример планирования задания ParallelFor

Код работы:

// Job adding two floating point values together public struct MyParallelJob : IJobParallelFor { [ReadOnly] public NativeArray a; [ReadOnly] public NativeArray b; public NativeArray result; public void Execute(int i) { result[i] = a[i] + b[i]; } }

Код основного потока:

NativeArray a = new NativeArray(2, Allocator.TempJob); NativeArray b = new NativeArray(2, Allocator.TempJob); NativeArray result = new NativeArray(2, Allocator.TempJob); a[0] = 1.1; b[0] = 2.2; a[1] = 3.3; b[1] = 4.4; MyParallelJob jobData = new MyParallelJob(); jobData.a = a; jobData.b = b; jobData.result = result; // Schedule the job with one Execute per index in the results array and only 1 item per processing batch JobHandle handle = jobData.Schedule(result.Length, 1); // Wait for the job to complete handle.Complete(); // Free the memory allocated by the arrays a.Dispose(); b.Dispose(); result.Dispose();
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3