Penjadwalan pekerjaan
Login Untuk pekerjaan

JobHandle dan ketergantungan

Ketika Anda memanggil metode Schedule pekerjaan itu kembali JobHandle. Anda dapat menggunakan JobHandle dalam kode Anda sebagai ketergantungan untuk pekerjaan lain. Jika pekerjaan tergantung pada hasil pekerjaan lain, Anda dapat melewati JobHandle pekerjaan pertama sebagai parameter ke metode Schedule pekerjaan kedua, seperti:

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

Note: Semua ketergantungan pekerjaan harus dijadwalkan pada benang kontrol yang sama sebagai pekerjaan itu sendiri.

Menggabungkan ketergantungan

Jika pekerjaan memiliki banyak ketergantungan, Anda dapat menggunakan metode JobHandle.CombineDependensi untuk menggabungkannya. CombineDependencies memungkinkan Anda untuk melewati metode Schedule.

NativeArray<JobHandle> handles = new NativeArray<JobHandle>(numJobs, Allocator.TempJob);

// Populate `handles` with `JobHandles` from multiple scheduled jobs...

JobHandle jh = JobHandle.CombineDependencies(handles);

Menunggu pekerjaan di benang kontrol

Gunakan JobHandle untuk memaksa kode Anda untuk menunggu di benang kontrol untuk pekerjaan Anda untuk menyelesaikan executing. Untuk melakukan ini, sebut metode Complete pada JobHandle. Pada titik ini, Anda tahu benang kontrol dapat dengan aman mengakses NativeContainer yang pekerjaannya digunakan.

Note: Pekerjaan tidak mulai mengeksekusi ketika Anda menjadwalkannya. Jika Anda menunggu pekerjaan di benang kontrol, dan Anda perlu akses ke data NativeContainer yang pekerjaannya digunakan, Anda dapat memanggil metode JobHandle.Complete. Metode ini membilas pekerjaan dari cache memori dan memulai proses eksekusi. Memanggil Complete pada kepemilikan JobHandle dari jenis NativeContainer pekerjaan ke benang kontrol. Anda perlu memanggil Complete pada JobHandle untuk mengakses jenis NativeContainer dari benang kontrol lagi. Hal ini juga dimungkinkan untuk mengembalikan kepemilikan ke benang kontrol dengan memanggil Complete pada JobHandle yang dari ketergantungan pekerjaan. Misalnya, Anda dapat memanggil Complete pada jobA, atau Anda dapat memanggil Complete pada jobB yang tergantung pada jobA. Hasil dari jenis NativeContainer yang digunakan oleh jobA aman untuk mengakses pada benang kontrol setelah panggilan ke Complete.

Jika Anda tidak perlu akses ke data, Anda perlu menyiram batch secara eksplisit. Untuk melakukan ini, sebut metode statis JobHandle.ScheduleBatchedJobs. Perhatikan bahwa memanggil metode ini dapat mempengaruhi kinerja negatif.

Contoh dari beberapa pekerjaan dan ketergantungan

Job code:

// Job adding two floating point values together
public struct MyJob : IJob
{
    public float a;
    public float b;
    public NativeArray<float> result;

    public void Execute()
    {
        result[0] = a + b;
    }
}

// Job adding one to a value
public struct AddOneJob : IJob
{
    public NativeArray<float> result;
    
    public void Execute()
    {
        result[0] = result[0] + 1;
    }
}

Main thread code:

// Create a native array of a single float to store the result in. This example waits for the job to complete
NativeArray<float> result = new NativeArray<float>(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();

  • 2018–06–15 Sitemap

  • Sistem Kerja C# terkena Oktober 2018

Penjadwalan pekerjaan
Login Untuk pekerjaan