Tối ưu game 3D cho điện thoại: 7 kỹ thuật thực tế

Thế giới của Một Ngày Làm Chó gồm hàng nghìn ngôi nhà, cây xanh, người đi bộ, xe máy và thời tiết thay đổi theo mùa. Đưa tất cả lên một chiếc điện thoại tầm trung mà vẫn giữ khung hình ổn định là bài toán chính của đội kỹ thuật AuraX. Dưới đây là bảy kỹ thuật đã áp dụng và số liệu đo được trong quá trình phát triển.
1. Ba mức đồ họa và tự hạ khi máy yếu
Trò chơi có ba mức cao, trung bình, thấp, khác nhau ở bóng đổ, tầm nhìn, bán kính nạp bản đồ và độ phân giải dựng hình 3D (mức trung bình dựng ở 85% độ phân giải màn hình). Điện thoại mặc định chạy 30 khung hình mỗi giây; nếu tốc độ khung hình thấp hơn 80% mục tiêu trong 8 giây liên tục, game tự hạ một mức đồ họa.
Số liệu đo trên máy phát triển tại khu phố đông nhất của bản đồ:
| Mức đồ họa | Lệnh vẽ (draw call) | Tam giác |
|---|---|---|
| Cao | khoảng 137 | khoảng 314 nghìn |
| Trung bình | khoảng 63 | khoảng 94 nghìn |
| Thấp | khoảng 31 | khoảng 32 nghìn |
Ở mức cao, bóng đổ chiếm khoảng một nửa số tam giác. Vì vậy mức trung bình tắt bóng của các chi tiết nhỏ (mặt tiền, cột điện, đồ trên mái) và chỉ giữ một tầng bóng trong 45 mét.
2. Chia bản đồ thành ô và gộp vật liệu
Bản đồ được chia thành ô 250 × 250 mét, mỗi ô chỉ 4–6 lệnh vẽ nhờ gộp toàn bộ tường nhà, chi tiết mái và mặt nước vào vài lưới lớn dùng chung vật liệu. Màu sơn và vị trí cửa sổ được mã hóa vào thuộc tính đỉnh, để một shader duy nhất vẽ được hàng nghìn ngôi nhà khác nhau.
3. Mức chi tiết theo khoảng cách
- Module mặt tiền 3D (ban công, khung cửa) mờ dần từ 100 đến 130 mét rồi ẩn.
- Cây có hai phiên bản: chi tiết khi gần, chỉ 26 tam giác khi xa.
- Dây điện ẩn sau 200 mét; vạch kẻ đường và đồ trên mái ẩn sau 320 mét.
- Dây điện chỉ dựng một mặt để không vẽ gấp đôi.
4. Đám đông bằng Vertex Animation Texture
Người đi bộ và người lái xe không dùng bộ xương hoạt ảnh như nhân vật chính. Chuyển động được nướng sẵn vào texture (Vertex Animation Texture – VAT): vị trí và pháp tuyến của từng đỉnh ở từng khung hình được lưu trong một ảnh, shader đọc ảnh đó để di chuyển đỉnh. Mỗi người chỉ khoảng 1.900 tam giác và không tốn chi phí tính xương trên CPU.
Mỗi người hoặc xe là một đối tượng riêng để engine tự loại bỏ những gì nằm ngoài khung hình và tự hạ mức chi tiết ở xa. Số lượng người và xe giảm theo mức đồ họa, và còn khoảng 35% vào ban đêm. Nhóm người và xe ở mức trung bình chỉ tốn khoảng 14 lệnh vẽ.
5. Ánh sáng ban đêm không cần đèn thật
Đèn thật rất đắt trên điện thoại. Ban đêm trong game được tạo bằng một biến shader toàn cục: shader nhà bật sáng cửa sổ và cửa hàng, shader xe bật đèn pha và đèn hậu, biển hiệu tự phát sáng nhẹ. Hiệu ứng trông như có hàng trăm nguồn sáng nhưng chi phí gần như bằng không.
6. Làm nóng shader trong màn tải
Hiện tượng giật khung hình lần đầu thấy một hiệu ứng thường do shader được biên dịch đúng lúc cần dùng. Trong màn tải, game vẽ trước toàn bộ hiệu ứng chiêu thức, mọi loại quái của bản đồ và 5 giống chó trong một khung nhìn nhỏ ẩn, để shader được biên dịch và lưu đệm trước khi người chơi vào trận.
7. Giảm dung lượng bản cài đặt
- Texture được nén theo định dạng của GPU kèm mipmap.
- Bản cài đặt chỉ chứa các ô của bản đồ đang mở; bản đồ mới có thể tải về sau dưới dạng gói riêng.
- Công cụ báo cáo dung lượng theo thư mục chạy sau mỗi lần xuất bản, báo lỗi nếu lọt tệp thừa.
Đo trước, tối ưu sau
Mọi kỹ thuật trên đều bắt đầu từ số liệu: chế độ đo tự động in số lệnh vẽ và tam giác của từng nhóm đối tượng, nên đội phát triển biết chính xác phần nào tốn nhất trước khi sửa. Đây cũng là cách AuraX tiếp cận tối ưu hiệu năng cho mọi ứng dụng di động – từ game đến ứng dụng thương mại.
Xem hình ảnh thực tế của trò chơi tại motngaylamcho.com hoặc liên hệ AuraX nếu ứng dụng của bạn cần cải thiện tốc độ.