JobHandle dan ketergantungan
ParalelForTransform

Login Untuk pekerjaan

Ketika penjadwalan pekerjaan, hanya ada satu pekerjaan yang melakukan satu tugas. Dalam permainan, itu umum untuk ingin melakukan operasi yang sama pada sejumlah besar benda. Ada jenis pekerjaan terpisah yang disebut Login Sitemap untuk menangani ini.

Note: Pekerjaan "ParallelFor" adalah istilah kolektif dalam Unity untuk setiap struct yang mengimplementasikan antarmuka IJobParallelFor.

Login Untuk pekerjaan menggunakan NativeArray data untuk bertindak sebagai sumber datanya. Login Untuk pekerjaan berjalan di beberapa core. Ada satu pekerjaan per inti, setiap penanganan subset beban kerja. IJobParallelFor berperilaku seperti IJob, tetapi bukan satu metode Execute, ia memanggil metode Execute sekali per item dalam sumber data. Ada parameter bilangan bulat dalam metode Execute. Indeks ini adalah untuk mengakses dan mengoperasikan satu elemen sumber data dalam implementasi pekerjaan.

Contoh definisi pekerjaan ParalelUntuk:

struct IncrementByDeltaTimeJob: IJobParallelFor
{
    public NativeArray<float> values;
    public float deltaTime;

    public void Execute (int index)
    {
        float temp = values[index];
        temp += deltaTime;
        values[index] = temp;
    }
}

Skema Paralel Untuk pekerjaan

Ketika penjadwalan Paralel Untuk pekerjaan, Anda harus menentukan panjang sumber data NativeArray yang Anda perpecahan. Sistem Kerja Unity C# tidak dapat tahu bahwa NativeArray yang ingin Anda gunakan sebagai sumber data jika ada beberapa di struct. Panjangnya juga memberi tahu C# Job System berapa banyak metode Execute untuk mengharapkan.

Di balik scenesAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
Lihat di Glossary
, penjadwalan ParallelFor pekerjaan lebih rumit. Ketika penjadwalan Paralel Untuk pekerjaan, Sistem Kerja C# membagi pekerjaan menjadi batch untuk mendistribusikan antara inti. Setiap batch mengandung subset metode Execute. Sistem Kerja C# kemudian menjadwalkan satu pekerjaan dalam sistem kerja asli Unity per inti CPU dan melewati pekerjaan asli beberapa batch untuk menyelesaikan.

A ParallelFor job dividing batches across cores
Login Untuk batch membagi pekerjaan di seluruh inti

Ketika pekerjaan asli menyelesaikan batch sebelum orang lain, itu steals sisa batch dari pekerjaan asli lainnya. Hanya mencuri setengah dari batch sisa pekerjaan asli pada waktu, untuk memastikan cache lokalitas.

Untuk mengoptimalkan proses, Anda perlu menentukan jumlah batch. Jumlah batch mengontrol berapa banyak pekerjaan yang Anda dapatkan, dan bagaimana baik-dibut redistribusi pekerjaan antara benang. Memiliki jumlah batch rendah, seperti 1, memberi Anda distribusi pekerjaan yang lebih merata antara benang. Itu datang dengan beberapa overhead, jadi kadang-kadang lebih baik untuk meningkatkan jumlah batch. Mulai pada 1 dan meningkatkan jumlah batch sampai ada keuntungan kinerja yang dapat dilalui adalah strategi yang valid.

Contoh penjadwalan ParalelUntuk pekerjaan

Job code:

// Job adding two floating point values together
public struct MyParallelJob : IJobParallelFor
{
    [ReadOnly]
    public NativeArray<float> a;
    [ReadOnly]
    public NativeArray<float> b;
    public NativeArray<float> result;

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

Control thread code:

NativeArray<float> a = new NativeArray<float>(2, Allocator.TempJob);

NativeArray<float> b = new NativeArray<float>(2, Allocator.TempJob);

NativeArray<float> result = new NativeArray<float>(2, Allocator.TempJob);

a[0] = 1.1;
b[0] = 2.2;
a[1] = 3.3;
b[1] = 4.4;

MyParallelJob jobData = new MyParallelJob();
jobData.a = a;  
jobData.b = b;
jobData.result = result;

// Schedule the job with one Execute per index in the results array and only 1 item per processing batch
JobHandle handle = jobData.Schedule(result.Length, 1);

// Wait for the job to complete
handle.Complete();

// Free the memory allocated by the arrays
a.Dispose();
b.Dispose();
result.Dispose();

  • 2018–06–15 Sitemap

  • Sistem Kerja C# terkena Oktober 2018

JobHandle dan ketergantungan
ParalelForTransform