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