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

JobHandle и зависимости

Когда вы вызываете метод Schedule задания, он возвращает Рабочий_Задание. Вы можете использовать JobHandle в своем коде как зависимость
Другие вакансии см. в Словарь
. Если задание зависит от результатов другого задания, вы можете передать JobHandle первого задания в качестве параметра Schedule второго задания. метод, например:

JobHandle firstJobHandle = firstJob.Schedule(); secondJob.Schedule(firstJobHandle);

Объединение зависимостей

Если у задания много зависимостей, вы можете использовать метод JobHandle.CombineDependencies для их объединения. CombineDependencies позволяет передавать их в метод Schedule.

NativeArray handles = new NativeArray(numJobs, Allocator.TempJob); // Populate `handles` with `JobHandles` from multiple scheduled jobs... JobHandle jh = JobHandle.CombineDependencies(handles);

Ожидание заданий в основном потоке

Используйте JobHandle, чтобы ваш код ожидал завершения выполнения задания в основном потоке. Для этого вызовите метод Complete для JobHandle. Теперь вы знаете, что основной поток может безопасно получить доступ к NativeContainer, который использовалось заданием.

Примечание. Задания не начинают выполняться, когда вы их планируете. Если вы ожидаете задание в основном потоке и вам нужен доступ к данным NativeContainer, которые использует задание, вы можете вызвать метод JobHandle.Complete. Этот метод сбрасывает задания из кеша памяти и запускает процесс выполнения. Вызов Complete для JobHandle возвращает право собственности на типы NativeContainer этого задания в основной поток. Вам нужно вызвать Complete для JobHandle, чтобы безопасно получить доступ к этим типам NativeContainer. снова из основного потока. Также можно вернуть право собственности основному потоку, вызвав Complete для JobHandle, который находится в зависимости от задания. Например, вы можете вызвать Complete для jobA или вы можете вызвать Complete на jobB, который зависит от jobA. Оба приводят к тому, что типы NativeContainer, используемые jobA, безопасны для доступа в основном потоке после вызова Завершить.

В противном случае, если вам не нужен доступ к данным, вам нужно явно очистить пакет. Для этого вызовите статический метод JobHandle.ScheduleBatchedJobs. Обратите внимание, что вызов этого метода может негативно сказаться на производительности.

Пример нескольких заданий и зависимостей

Код работы:

// Job adding two floating point values together public struct MyJob : IJob { public float a; public float b; public NativeArray result; public void Execute() { result[0] = a + b; } } // Job adding one to a value public struct AddOneJob : IJob { public NativeArray result; public void Execute() { result[0] = result[0] + 1; } }

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

// Create a native array of a single float to store the result in. This example waits for the job to complete NativeArray result = new NativeArray(1, Allocator.TempJob); // Setup the data for job #1 MyJob jobData = new MyJob(); jobData.a = 10; jobData.b = 10; jobData.result = result; // Schedule job #1 JobHandle firstHandle = jobData.Schedule(); // Setup the data for job #2 AddOneJob incJobData = new AddOneJob(); incJobData.result = result; // Schedule job #2 JobHandle secondHandle = incJobData.Schedule(firstHandle); // Wait for job #2 to complete secondHandle.Complete(); // All copies of the NativeArray point to the same memory, you can access the result in "your" copy of the NativeArray float aPlusB = result[0]; // Free the memory allocated by the result array result.Dispose();
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3