Đa luồng trong game Mobile và bản build WebGL khác nhau thế nào?
Minh Khoa
Tác giả
Nói ngắn gọn: Mobile hỗ trợ thread C# bình thường và Job System. Unity Web thì
Thread/Task.Runvẫn không được hỗ trợ; riêng từ Unity 6.4, C# Job có[BurstCompile]đã có thể chạy song song nếu cấu hình đúng.
Phiên bản rất quan trọng: Unity 6.3 LTS và 6.4+ có hành vi khác nhau. Ở 6.3, C# trên Web vẫn chỉ có một thread. Ở 6.4, Burst Job là ngoại lệ có thể dùng worker thread thật.
## Hình dung đơn giản
- Mobile: căn bếp có nhiều phụ bếp. Bạn có thể giao việc qua Thread, Task hoặc Job System.
- Web 6.3: chỉ có một đầu bếp C#. Coroutine chỉ giúp đầu bếp đổi sang việc khác trong lúc chờ, không sinh thêm người.
- Web 6.4: có thêm một đội phụ bếp, nhưng họ chỉ nhận những “phiếu việc” đã được Job System + Burst chuẩn hóa.
Mobile: Main ─┬─ Task / Thread
└─ Jobs / Burst ──► worker threads
Web 6.3: Main ──► toàn bộ C#
Web 6.4: Main ─┬─ C# thông thường
└─ Burst Jobs ─────► worker threads
So sánh nhanh
| Tác vụ | Mobile | Web 6.3 | Web 6.4+ |
|---|---|---|---|
Thread, Task.Run | Dùng được | Không hỗ trợ | Vẫn không hỗ trợ |
| Job không có Burst | Có thể chạy worker | Chạy main thread | Chạy main thread |
Job có [BurstCompile] | Chạy song song | Chưa chạy song song | Có thể chạy song song |
| Coroutine / Awaitable | Bất đồng bộ, không tự tạo thread | Bất đồng bộ | Bất đồng bộ |
| Sửa GameObject / Transform / UI | Main thread | Main thread | Main thread |
Mobile: có thể chuyển việc sang thread khác
Ví dụ tính toán dữ liệu nặng mà không cần Unity API:
async Awaitable<int> CalculateOnMobile(int[] input)
{
await Awaitable.BackgroundThreadAsync();
// Chỉ tính dữ liệu thuần, không gọi GameObject hay Transform.
int result = HeavyCalculation(input);
await Awaitable.MainThreadAsync();
return result;
}