Ghi Chú Phát Triển (26): Mô-Đun AOI Và Chuyển Động - nói dối e blog

Ghi Chú Phát Triển (26): Mô-Đun AOI Và Chuyển Động

Thời gian gần đây, tôi tập trung tối ưu hiệu năng hệ thống máy chủ game nhằm nâng cao khả năng chịu tải. Những cải tiến chính bao gồm:

1. Bộ Giám Sát Thời Gian Thực Sau khi viết lại toàn bộ kiến trúc nền tảng và cập nhật giao thức truyền tin, lần đầu tiên chúng tôi có thể triển khai hệ thống giám sát thời gian xử lý từng dịch vụ. Trước đây điều này gần như bất khả thi vì:

  • Dữ liệu chỉ được nhìn nhận như các gói tin rời rạc ở tầng thấp
  • Một yêu cầu hoàn chỉnh thường yêu cầu nhiều gói tin qua lại
  • Khi service gọi remote API, tiến trình sẽ bị tạm ngưng đến khi nhận phản hồi

Bằng cách công khai session ID cho các module nền tảng, chúng tôi đã xây dựng thành công hệ thống giám sát phân tán. Điều này cho phép theo dõi toàn bộ hành trình xử lý yêu cầu từ đầu đến cuối.

2. Chuyển Từ Erlang sang C Việc chuyển đổi hoàn toàn sang C mang lại lợi thế sử dụng các công cụ profile chuyên nghiệp như gprof. Tuy nhiên qua phân tích, hơn 70% tài nguyên CPU tập trung ở máy ảo Lua. Điều này cho thấy việc tối ưu thêm ở tầng C không còn hiệu quả - cần chuyển trọng tâm lên tầng Lua.

3. Tối Ưu Lua Với LuaJIT Ban đầu dự án sử dụng Lua 5.2, nhưng sau khi tham gia mailinglist LuaJIT, tôi nhận thấy khả năng tương lai tươi sáng nhờ:

  • Cộng đồng hỗ trợ nhanh chóng (hầu hết bug được sửa trong 24h)
  • LuaJIT 2.0 đã bắt đầu hỗ trợ một số tính năng mới của Lua 5.2 như debug.getlocal Tuy nhiên do tiến độ dự án, việc tích hợp LuaJIT tạm hoãn để chờ các nhóm khác hoàn thành tính năng game.

4. Phân Tích Gốc Rễ Vấn Đề CPU Phân tích sơ bộ cho thấy 65% CPU tập trung ở xử lý chuyển động NPC trên bản đồ. Vấn đề tồn tại ở mô hình AI hiện tại:

  • Chỉ phân loại NPC thành chủ động tấn công và phản công
  • Thiếu lớp NPC thứ 3: tương tác người chơi nhưng bỏ qua đối thủ
  • Hàng ngàn NPC bị động vẫn chạy cơ chế heartbeat định kỳ dù không có người chơi lân cận

5. Giải Pháp Hai Mặt a. Cải Tiến Mô Hình AI

  • Thiết kế lớp NPC “chờ kích hoạt”: chỉ kích hoạt AI khi nhận tin nhắn từ agent người chơi
  • Giảm 90% tài nguyên tiêu hao trên các bản đồ vắng người

b. Tối Ưu Tính Toán Vector Chuyển phần xử lý vector 3D (trước đây viết bằng Lua) sang C nhằm giảm tải cho máy ảo Lua.

6. Thiết Kế Lại Mô-đun AOI Dựa trên kinh nghiệm thực tế nửa năm qua, tôi tái cấu trúc mô-đun AOI với các yêu cầu cốt lõi:

  1. Truy vấn vật thể trong bán kính cho trước
  2. Theo dõi sự thay đổi danh sách vật thể xung quanh
  3. Hỗ trợ chuyển động thẳng đều và bám đuôi vật thể khác

Khác biệt lớn nhất: Hợp nhất chức năng truy vấn và theo dõi thay vì dùng cơ chế gửi tin nhắn sự kiện. Giảm 75% chi phí xử lý bằng cách:

  • Chỉ trả về sự khác biệt giữa hai lần truy vấn liên tiếp
  • Sử dụng cơ chế “vùng đệm” (rad_short/rad_long) tránh dao động kết quả

7. Giao Diện API Mới

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
struct map * map_new(float w, float h);  // Tạo bản đồ mới
void map_delete(struct map *m);         // Giải phóng bản đồ
int map_insert(struct map *m, const char * mode); // Thêm vật thể
void map_erase(struct map *m, int handle);       // Xóa vật thể
void map_location(struct map *m, int handle, float pos[3]); // Cập nhật vị trí
void map_moveto(struct map *m, int handle, float target[3]); // Di chuyển đến tọa độ
void map_follow(struct map *m, int handle, int who);        // Bám đuôi vật thể
void map_speed(struct map *m, int handle, float speed);     // Thiết lập tốc độ
void map_move(struct map *m, float tick);                   // Cập nhật chuyển động
const float * map_velocity(struct map *m, int handle);      // Lấy vector vận tốc
const float * map_position(struct map *m, int handle);      // Lấy tọa độ hiện tại
int map_around(struct map *m, int handle, float rad_short, float rad_long, 
  void (*around_cb)(void *ud, int handle, int enter), void *ud); // Truy vấn vật thể xung quanh

8. Ưu Điểm Nổi Bật

  • ID vật thể duy nhất, không tái sử dụng sau khi xóa
  • Tách biệt logic chuyển động khỏi xử lý sự kiện
  • Dễ dàng tích hợp với Lua thông qua wrapper gọn nhẹ
  • Hỗ trợ hiệu quả các tính năng game như:
    • Tấn công vùng diện rộng (AOE)
    • Kích hoạt AI theo ngữ cảnh
    • Tối ưu hóa pathfinding

9. Kế Hoạch Tiếp Theo

  • Hoàn thiện wrapper Lua trong tháng tới
  • Tích hợp với hệ thống AI hiện tại
  • Thử nghiệm hiệu năng trên môi trường staging
  • Tối ưu hóa thêm cho các bản đồ có mật độ vật thể cao

Mô-đun này sẽ thay thế hoàn toàn phiên bản cũ (đã hoạt động ổn định 18 tháng qua) nhờ hiệu năng vượt trội và giao diện trực quan hơn. Việc chuyển đổi sẽ được thực hiện từng bước để đảm bảo tính ổn định của hệ thống.

0%