Когда вы вызываете метод 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();

