Những Cải Tiến Đáng Kể Của Ant Engine
Trong thời gian gần đây, tôi đã tích cực tìm kiếm các dự án hợp tác nội bộ công ty để thúc đẩy ứng dụng Ant Engine. Một trong những lợi thế cốt lõi của động cơ tự phát triển này nằm ở khả năng tối ưu hóa sâu theo đặc thù từng tựa game. Trong phạm vi giới hạn phần cứng thiết bị mục tiêu, chúng tôi có thể nâng cao chất lượng hình ảnh và trải nghiệm tương tác lên mức tối đa. Điều này gần như bất khả thi với các động cơ thương mại phổ thông, nơi mà các kỹ thuật tối ưu hóa thường bị giới hạn bởi kiến trúc cố định.
Tựa game đầu tiên xây dựng trên Ant Engine - Red Frontier từng đối mặt với khủng hoảng hiệu năng nghiêm trọng cách đây một năm. Trên iPhone 8, game thậm chí không đạt nổi 30fps, khiến trải nghiệm giật lag khó chịu. Nhiều vấn đề hiệu năng đã được nhận diện từ trước, đặc biệt là việc xây dựng toàn bộ hệ thống động cơ bằng Lua. Trong giai đoạn đầu, chúng tôi chỉ tập trung vào thiết kế kiến trúc và đảm bảo tính chính xác, còn hiệu năng bị gác lại chờ xử lý sau.
Phương án tối ưu hóa đã được hoạch định rõ ràng từ đầu: Tận dụng framework Lua ECS để lưu trữ cấu trúc dữ liệu trong bộ nhớ C, cho phép bỏ qua lớp xử lý Lua khi cần thiết và trực tiếp thao tác dữ liệu bằng C. Sau 3 tháng tập trung tái cấu trúc hệ thống render sang C, hiệu năng đã tăng vọt hơn 10 lần. Quá trình này được kiểm soát chặt chẽ theo lộ trình đề ra.
Tuy nhiên, ngay cả khi đạt 60fps, hành trình tối ưu hóa vẫn chưa dừng lại. Với thiết bị di động, vấn đề tiêu thụ năng lượng còn quan trọng hơn cả hiệu năng. Khác với máy console/PC cắm nguồn cố định, người dùng di động luôn lo lắng về thời lượng pin. Một tựa game tiêu hao năng lượng quá mức có thể khiến họ băn khoăn liệu chiếc điện thoại có đủ pin để thanh toán tiền xe buýt hay quét mã QR mua bữa trưa.
Điều này khiến tôi tự hỏi liệu các thể loại game “nặng” yêu cầu tập trung liên tục có thực sự phù hợp với nền tảng di động? Có lẽ các thể loại như idle game - nơi người chơi tương tác gián đoạn mới là lựa chọn tối ưu hơn?
Sau khi đạt ngưỡng khung hình mục tiêu, hướng tiếp cận tối ưu hóa hoàn toàn thay đổi. Trước đây, chúng tôi tập trung giảm độ trễ từng tác vụ để tăng fps. Nay mục tiêu chuyển sang tiết kiệm năng lượng - thay vì tối ưu tốc độ, cần giảm thiểu các phép tính lặp lại trong khoảng thời gian dài. Thậm chí chấp nhận việc tái sử dụng kết quả tính toán tốn kém trước đó dù tốc độ có chậm hơn một chút.
Các nhà sản xuất phần cứng cũng đang theo đuổi xu hướng này. Ví dụ kiến trúc GPU Tile-based rendering không nhằm tăng tốc độ render mà tập trung phát hiện và loại bỏ các phép tính trùng lặp, lưu trữ kết quả để tái sử dụng ở frame kế tiếp - tất cả nhằm mục tiêu tiết kiệm năng lượng.
Trên phương diện thiết kế phần mềm, chúng tôi đã thực hiện nhiều cải tiến sáng tạo. Trong blog trước, tôi từng đề cập các hướng tối ưu hóa tiềm năng. Dưới đây là một số ví dụ cụ thể từ dự án hiện tại:
Tối ưu hóa chuyển động đối tượng
Trong game tồn tại hàng trăm đối tượng di chuyển liên tục như xe tải trên đường, drone vận chuyển hàng hóa. Nếu xử lý truyền thống, mỗi frame đều phải tính toán lại vị trí trong Lua - gây áp lực lớn. Chúng tôi đã giải quyết bằng cách:
- Tính toán vị trí ở gameplay layer với tần suất rất thấp
- Sử dụng motion interpolator viết bằng C để nội suy quỹ đạo chuyển động mượt mà giữa các điểm rời rạc
Giải pháp này giảm 80% tải tính toán trên Lua.
Cách mạng hóa hệ thống animation
Ban đầu, các công trình kiến trúc sử dụng kỹ thuật skinned animation phức tạp từ Blender. Tuy nhiên sự khác biệt về pha animation khiến khó thực hiện batching. Chúng tôi đã cải tiến bằng cách:
- Phân loại animation thành 4 nhóm tiêu chuẩn (dừng, hoạt động, chuyển tiếp 1, chuyển tiếp 2)
- Đồng bộ hóa độ dài mỗi animation thành 3 giây
- Đồng bộ thời điểm chuyển đổi animation ở gameplay layer
Kết quả: Tất cả công trình cùng loại sẽ có pha animation đồng nhất, cho phép batching hiệu quả.
Chuyển đổi sang rigid body animation
Phân tích cho thấy các animation cơ giới không cần skinned mesh phức tạp. Bằng cách:
- Phân rã máy móc thành các bộ phận cứng
- Sử dụng bone trực tiếp điều khiển các rigid body
- Phát triển công cụ chuyên dụng cho artist
Chỉ trong 3 tháng, toàn bộ animation đã được chuyển đổi, hiệu năng tăng thêm 40%.
Hiện tại, Red Frontier tiêu thụ năng lượng thấp hơn cả các ứng dụng mạng xã hội như WeChat hay TikTok. Điều này giúp tôi yên tâm tập trung cải thiện gameplay thay vì lo lắng về hiệu năng.
Trong một dự án mới của công ty - tựa game sinh tồn thế giới mở 3D với bối cảnh phức tạp kiểu Zelda hay World of Warcraft, tôi đã hình dung cách tối ưu hóa bằng Ant Engine. Dù hiện tại đang dùng Unity với hiệu năng chưa khả quan (dưới 30fps trên PC), nhưng với Ant Engine, chúng tôi sẽ áp dụng các giải pháp sau:
Tối ưu hóa cảnh quan quy mô lớn
- Sử dụng hệ thống剔除 (culling) đa tầng:
剔除 tĩnh dựa trên kiến trúc cảnh quan (ví dụ: phòng kín không cần render cảnh ngoài trời)
剔除 động dựa trên khoảng cách và kích thước đối tượng - Tách quy trình剔除 sang thread riêng, kết hợp dữ liệu offline để tạo tập hợp khả thi thô sơ
- Sử dụng cơ chế yêu cầu asynchronous với độ trễ chấp nhận được (dựa trên giả định người chơi di chuyển chậm so với quy mô bản đồ)
- Tối ưu hóa hệ thống ánh sáng bằng cách kết hợp剔除 ánh sáng asynchronous với dữ liệu kiến trúc cảnh quan
Những cải tiến này không chỉ giúp xử lý cảnh quan phức tạp mà còn mở ra hướng phát triển cho các tựa game thế giới mở trên nền tảng di động. Với Ant Engine, chúng tôi tin tưởng có thể phá vỡ giới hạn hiện tại, mang đến trải nghiệm AAA chất lượng cao mà vẫn tiết kiệm năng lượng.