Hiểu Về Static Batching và GPU Instancing
Minh Khoa
Tác giả
Khi phát triển game, một trong những "kẻ thù" lớn nhất của hiệu năng (Framerate/FPS) chính là Draw Call (hay Batches trong Unity). Lượng Draw Call càng cao, CPU càng mất nhiều thời gian để ra lệnh cho GPU vẽ hình ảnh, dẫn đến tình trạng giật lag, thiết bị nóng và hao pin.
Để giải quyết vấn đề này, Unity cung cấp nhiều kỹ thuật gom nhóm (Batching) nhằm giảm thiểu số lượng Draw Call. Trong bài viết này, chúng ta sẽ mổ xẻ và so sánh hai kỹ thuật mạnh mẽ và phổ biến nhất: Static Batching và GPU Instancing.
1. Giới thiệu: Vấn đề cốt lõi của Draw Call
Trước khi tối ưu, ta cần hiểu vì sao phải tối ưu:
- CPU đóng vai trò là "chỉ huy", chuẩn bị dữ liệu (Vị trí, Material, Mesh, Shader,...) và gửi lệnh rẽ cho GPU.
- Mỗi lần gửi lệnh vẽ một vật thể, CPU gọi một Draw Call.
- GPU vẽ rất nhanh, nhưng quá trình CPU chuẩn bị dữ liệu và gửi đi lại rất chậm. Nếu có 10.000 cái cây, CPU phải gửi 10.000 lệnh vẽ. CPU sẽ bị quá tải (CPU Bound) trong khi GPU thì "ngồi chơi xơi nước" chờ lệnh.
Mục tiêu của Batching là: Gom cực nhiều vật thể lại thành 1 cục dữ liệu lớn để CPU chỉ phải ra 1 lệnh Draw Call duy nhất.
2. Static Batching là gì?
Static Batching là kỹ thuật mà trong quá trình Build game (hoặc lúc Scene khởi tạo), Unity sẽ âm thầm gộp (combine) tất cả các Mesh của các vật thể đứng yên cùng sử dụng chung một Material thành một Mesh khổng lồ duy nhất.
Cơ chế hoạt động:
- Bạn đánh dấu các GameObject không di chuyển là
Static(chính xác là tick chọn ôBatching Staticở góc phải trên Editor). - Lúc Build game, Unity sẽ duyệt qua tất cả các vật thể
Staticdùng chung Material này. - Unity sao chép dữ liệu từng Mesh nhỏ, biến đổi tọa độ (Vertex) của chúng về tọa độ thế giới (World Space), rồi nối lại thành một Mesh khổng lồ (VBO lưu trong bộ nhớ).
- Khi chạy game, CPU chỉ gọi 1 Draw Call để vẽ cái "Mesh khổng lồ" đó.
Ưu điểm:
- Tốc độ render cực kỳ hoàn hảo: GPU thích việc vẽ những Mesh liền mạch khổng lồ, nên đây là phương pháp hiệu suất ổn định nhất.
- Hoạt động với mọi loại Mesh hình thù khác nhau: Bất kể bạn có 10 cái cây to, 5 tảng đá tròn hay 20 cái giếng... miễn là chúng CHUNG Material, Unity gộp lại được hết!