Cải Tiến Bộ Lập Lịch Nhiệm Vụ Ltask - nói dối e blog

Cải Tiến Bộ Lập Lịch Nhiệm Vụ Ltask

Trong quá trình phân tích hiệu năng của Ant Engine, chúng tôi nhận thấy cần phải nâng cấp hệ thống ltask - một trong những nền tảng cốt lõi của Ant Engine. Là hệ thống quản lý song song đa nhiệm vụ, hiệu quả của ltask trực tiếp ảnh hưởng đến tốc độ khung hình trong game - yếu tố then chốt quyết định trải nghiệm người dùng.

Khác với skynet tập trung tối ưu hiệu suất máy chủ với hàng ngàn nhiệm vụ đồng đều, ltask hoạt động trong môi trường client với đặc thù: chỉ có 1-2 nhiệm vụ nặng và nhiều nhiệm vụ nhẹ. Điều này đòi hỏi chiến lược lập lịch phải hướng đến độ trễ tối thiểu thay vì tập trung khai thác tối đa lõi CPU.

Chúng tôi nhận ra mấu chốt nằm ở việc xử lý hiệu quả nhiệm vụ chủ đạo (main task). Để rút ngắn thời gian xử lý mỗi khung hình, mọi công đoạn phụ trợ cần hoàn thành nhanh nhất có thể để kích hoạt tức thì cho các bước tiếp theo. Điều này yêu cầu thuật toán lập lịch phức tạp hơn nhưng bù lại sẽ giảm đáng kể độ trễ tổng thể.

Trong quá trình cải tiến, chúng tôi tập trung giải quyết ba vấn đề cốt lõi:

1. Xử lý các API hệ thống gây chặn luồng Các dịch vụ như timer hay I/O thường bị kẹt ở các lệnh hệ thống (sleep, select, epoll_wait…). Trước đây, chúng tôi phải tách riêng các luồng độc quyền để xử lý, nhưng cách này làm phức tạp hóa kiến trúc. Giải pháp mới cho phép các luồng chia sẻ vẫn có thể xử lý các API này bằng cơ chế “yield-resume” thông minh, tương tự như cách Python xử lý GIL khi gọi thư viện C.

2. Đảm bảo tính nhất quán luồng xử lý Một số thư viện C yêu cầu phải được gọi liên tục trên cùng một luồng (do sử dụng TLS - Thread Local Storage). Chúng tôi đã cải tiến bộ lập lịch để hỗ trợ “gắn cố định” một nhiệm vụ vào luồng cụ thể, nhưng không phải theo kiểu độc quyền. Điều này giúp đảm bảo tính toàn vẹn của các API nhạy cảm với luồng xử lý, đồng thời vẫn duy trì hiệu suất tổng thể.

3. Xử lý trường hợp đặc biệt trên iOS Với vấn đề luồng chính bị chặn vĩnh viễn sau khi tạo cửa sổ trên iOS, chúng tôi chọn giải pháp tách biệt hoàn toàn khỏi ltask thay vì tích hợp vào thư viện. Điều này giúp giữ cho ltask thuần khiết hơn, tập trung vào việc quản lý song song đa máy ảo Lua.

Một trong những cải tiến quan trọng là loại bỏ hoàn toàn cơ chế “dịch vụ luồng độc quyền” vốn phức tạp và ít hiệu quả. Thay vào đó, chúng tôi xây dựng cơ chế “gắn luồng mềm” (soft thread affinity) linh hoạt hơn. Điều này không chỉ giúp đơn giản hóa mã nguồn (giảm 600+ dòng C và nhiều đoạn mã Lua), mà còn mở ra khả năng tối ưu sâu hơn cho các kịch bản cụ thể.

Kết quả thử nghiệm thực tế cho thấy phiên bản mới của ltask đã đạt được mục tiêu đề ra: tăng 15-20% tốc độ khung hình trong các tình huống chơi game điển hình. Đặc biệt, độ trễ xử lý các nhiệm vụ chủ đạo giảm rõ rệt, mang lại trải nghiệm mượt mà hơn cho người dùng cuối.

Thông qua dự án này, chúng tôi nhận ra rằng việc tự xây dựng bộ lập lịch chuyên dụng thay vì dựa vào hệ điều hành mang lại nhiều lợi thế trong các trường hợp đặc biệt. Sự hiểu biết sâu sắc về đặc thù ứng dụng cho phép chúng tôi đưa ra các quyết định tối ưu hóa chính xác, điều mà các cơ chế lập lịch chung chung khó có thể đạt được.

0%