Описание
Атрибут ReadOnly позволяет пометить член структуры, используемый в задании, как доступный только для чтения.
При использовании в задании собственные контейнеры по умолчанию доступны для чтения и записи. Это означает, что вы не можете запланировать одновременно два задания, ссылающихся на одни и те же контейнеры. При добавлении атрибута ReadOnly к полю контейнера в структуре задания контейнер помечается как доступный только для чтения, что позволяет параллельно выполнять два задания чтения данных. из того же контейнера.
Смотрите так же: IJob, IJobParallelFor.
using Unity.Jobs;
using Unity.Collections;
using UnityEngine;
public struct MyJob : IJob
{
[ReadOnly]
public NativeArray input;
public NativeArray output;
public void Execute()
{
for (var i = 0; i < output.Length; ++i)
output[i] = input[i];
}
}
public class ParallelReplicator : MonoBehaviour
{
public void OnUpdate()
{
const int n = 10000;
var original = new NativeArray(n, Allocator.Persistent);
var clone1 = new NativeArray(n, Allocator.Persistent);
var clone2 = new NativeArray(n, Allocator.Persistent);
var job1 = new MyJob
{
input = original,
output = clone1
};
var job2 = new MyJob
{
input = original,
output = clone2
};
var jobX = new MyJob
{
input = original,
output = clone2
};
// Run the jobs in parallel.
var jobs = JobHandle.CombineDependencies(job1.Schedule(), job2.Schedule());
// jobX.Schedule(); // Not allowed, throws exception because job2 is writing into copy2.
jobs.Complete();
jobX.Schedule().Complete(); // Allowed, because job2 has been completed by now.
original.Dispose();
clone1.Dispose();
clone2.Dispose();
}
}