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

IJobFor

интерфейс в Unity.Jobs

Описание

Задания позволяют выполнять одну и ту же независимую операцию для каждого элемента нативного контейнера или для фиксированного количества итераций. Этот тип задания дает вам максимальную гибкость при планировании задания.

Задание допускает несколько вариантов планирования работы. :

Выполнить — задание будет запущено в основном потоке и немедленно завершено.

Расписание запланирует запуск задания в рабочем потоке (или, возможно, в основном потоке), но укажет, что работа должна выполняться в одном потоке. Этот параметр позволяет выполнять работу вне основного потока, но упрощает ее рассмотрение, поскольку работа будет выполняться последовательно.

ScheduleParallel запланирует задание для одновременного запуска в нескольких рабочих потоках. Этот вариант планирования может обеспечить наилучшую производительность, но требует от пользователя понимания конфликтов, которые могут возникнуть при одновременном доступе к одним и тем же данным из нескольких рабочих потоков.

Execute(int index) будет выполняться один раз для каждого индекса от 0 до указанной длины.

Run and Schedule гарантирует, что метод Execute(int index) задания будет вызываться последовательно.

ScheduleParallel не дает такой гарантии, поскольку он будет вызываться из нескольких рабочих потоков параллельно друг другу. Каждая итерация должна быть независимой от других итераций (система безопасности обеспечивает соблюдение этого правила за вас). Индексы не имеют гарантированного порядка и выполняются на нескольких ядрах параллельно. Unity автоматически разбивает работу на куски размером не менее предоставленного batchSize и планирует соответствующее количество заданий на основе количества рабочих потоков, длины массива и размера пакета. Размер партии обычно следует выбирать в зависимости от объема работы, выполняемой в задании. Простая работа, например, добавление пары Vector3 друг к другу, вероятно, должна иметь размер пакета от 32 до 128. Однако, если выполняемая работа очень дорогая, то лучше использовать небольшой размер пакета, для дорогостоящей работы размер пакета из 1 совершенно нормально. IJobFor выполняет кражу работы, используя атомарные операции. Размеры пакетов могут быть небольшими, но они не бесплатны.

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

using UnityEngine; using Unity.Collections; using Unity.Jobs;

class ApplyVelocityParallelForSample : MonoBehaviour { struct VelocityJob : IJobFor { // Jobs declare all data that will be accessed in the job // By declaring it as read only, multiple jobs are allowed to access the data in parallel [ReadOnly] public NativeArray<Vector3> velocity;

// By default containers are assumed to be read & write public NativeArray<Vector3> position;

// Delta time must be copied to the job since jobs generally don't have concept of a frame. // The main thread waits for the job same frame or next frame, but the job should do work deterministically // independent on when the job happens to run on the worker threads. public float deltaTime;

// The code actually running on the job public void Execute(int i) { // Move the positions based on delta time and velocity position[i] = position[i] + velocity[i] * deltaTime; } }

public void Update() { var position = new NativeArray<Vector3>(500, Allocator.Persistent);

var velocity = new NativeArray<Vector3>(500, Allocator.Persistent); for (var i = 0; i < velocity.Length; i++) velocity[i] = new Vector3(0, 10, 0);

// Initialize the job data var job = new VelocityJob() { deltaTime = Time.deltaTime, position = position, velocity = velocity };

// Schedule job to run immediately on main thread. First parameter is how many for-each iterations to perform. job.Run(position.Length);

// Schedule job to run at a later point on a single worker thread. // First parameter is how many for-each iterations to perform. // The second parameter is a JobHandle to use for this job's dependencies. // Dependencies are used to ensure that a job executes on worker threads after the dependency has completed execution. // In this case we don't need our job to depend on anything so we can use a default one. JobHandle sheduleJobDependency = new JobHandle(); JobHandle sheduleJobHandle = job.Schedule(position.Length, sheduleJobDependency);

// Schedule job to run on parallel worker threads. // First parameter is how many for-each iterations to perform. // The second parameter is the batch size, // essentially the no-overhead innerloop that just invokes Execute(i) in a loop. // When there is a lot of work in each iteration then a value of 1 can be sensible. // When there is very little work values of 32 or 64 can make sense. // The third parameter is a JobHandle to use for this job's dependencies. // Dependencies are used to ensure that a job executes on worker threads after the dependency has completed execution. JobHandle sheduleParralelJobHandle = job.ScheduleParallel(position.Length, 64, sheduleJobHandle);

// Ensure the job has completed. // It is not recommended to Complete a job immediately, // since that reduces the chance of having other jobs run in parallel with this one. // You optimally want to schedule a job early in a frame and then wait for it later in the frame. sheduleParralelJobHandle.Complete();

Debug.Log(job.position[0]);

// Native arrays must be disposed manually. position.Dispose(); velocity.Dispose(); } }

Публичные Методы

Execute Реализуйте этот метод для выполнения работы с определенным индексом итерации.
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3