Giữ cảnh chạy nhanh
Assets/
Scenes/
Arena.unity
Scripts/
Prefabs/
thiết lập dự án
đã có sẵnbài này thêm
Sân đấu từng chạy hàng trăm khung hình mỗi giây khi nó chỉ có mười một vật thể trên nền xám. Có thêm vài trăm cái cây quanh nó thì không được vậy nữa — trừ khi bạn làm bốn việc trong bài này.
Một cảnh chạy 12 FPS thì không phải cảnh, đó là ảnh chụp màn hình. Bốn kỹ thuật sau lấp gần hết khoảng cách từ 12 lên 60.
Vật ở xa dùng lưới đơn giản hơn. Người chơi không nhận ra lúc đổi.
1. Đo trước khi sửa bất cứ thứ gì
- 1
Mở và xem hàng CPU và Rendering.
- 2
Ở bảng Stats của Game view, xem Batches và Tris — trong lúc điều khiển Knight đi lại, không phải lúc đứng yên.
- 3
Nếu thời gian CPU cao → quá nhiều draw call hoặc script nặng. Nếu GPU cao → quá nhiều điểm ảnh, vẽ chồng hoặc shader nặng.
2. Nhóm LOD
- 1
Chọn một vật thể, Add Component → LOD Group.
- 2
Kéo mesh nhiều tam giác vào LOD 0, mesh trung bình vào LOD 1, mesh thô vào LOD 2.
- 3
Đặt vùng Culled để vật biến mất hẳn khi nó chỉ còn vài điểm ảnh.
- 4
Cây, nhà và đá tảng hưởng lợi nhất. Sỏi nhỏ thì không đáng công.
3. Giảm số lệnh vẽ
Static Batching: tick Static cho mọi vật không di chuyển. Unity gộp chúng thành lưới chung lúc build.
GPU Instancing: tick Enable GPU Instancing trên material của thứ lặp lại hàng trăm lần. 500 hòn đá giống nhau thành một draw call.
Ít material hơn thì ít batch hơn. Hai vật cùng material thì gộp được; cùng vật mà khác material thì không.
Gộp texture vào atlas: một ảnh 2048 chứa mười hai vật tốt hơn mười hai ảnh 512.
4. Loại bỏ vật bị che
- 1
Cắt theo tầm nhìn (không vẽ thứ ngoài màn hình) là tự động. Cắt theo che khuất (không vẽ thứ nấp sau tường) thì không.
- 2
Đánh dấu tường và nhà là Occluder Static, rồi .
- 3
Đáng làm với nội thất và thành phố dày đặc. Vô ích với đồng trống nhìn thấy hết.
5. Rút ngắn tầm nhìn của camera
// Far mặc định là 1000. Đa số màn chơi chỉ cần 150.
Camera.main.farClipPlane = 150f;
//dùng sương mù che chỗ cắt
RenderSettings.fog = true;
RenderSettings.fogMode = FogMode.Linear;
RenderSettings.fogStartDistance = 90f;
RenderSettings.fogEndDistance = 145f;Khoảng cắt riêng theo layer
void Start()
{
float[] distances = new float[32]; // mỗi layer một giá trị
for (int i = 0; i < 32; i++) distances[i] = 150f;
distances[LayerMask.NameToLayer("SmallProps")] = 35f; // sỏi biến mất sớm
distances[LayerMask.NameToLayer("Grass")] = 25f;
Camera.main.layerCullDistances = distances;
}