Ghi Chú Phát Triển (19): Kiểm Soát Di Chuyển Của Quái Vật
Bản ghi phát triển phần mềm (19): Cơ chế điều khiển quái vật di chuyển
Dự án đang tiến triển ổn định trong thời gian gần đây, Dinh Đang phụ trách giám sát tiến độ, còn tôi tập trung giải quyết các vấn đề kỹ thuật nhỏ phát sinh trong quá trình phát triển.
Hiện tại tôi đang tập trung vào việc tối ưu hóa cơ chế điều khiển hành vi và trí tuệ nhân tạo của các nhân vật phi người chơi (NPC) bao gồm cả quái vật trong trò chơi. Hiện tại hệ thống đã cho phép người chơi đăng nhập từ client vào server, tự do di chuyển trong bản đồ và thực hiện các thao tác chiến đấu đơn giản cùng kỹ năng cơ bản.
Theo thiết kế ban đầu, mỗi người chơi sẽ được cấp một dịch vụ agent độc lập trên server. Quá trình phát triển hiện tại tuy có điều chỉnh một số phương pháp triển khai cụ thể nhưng vẫn giữ nguyên tư tưởng cốt lõi. Đặc biệt cần loại bỏ tối đa việc sử dụng các phương thức callback bất đồng bộ truyền thống để tạo ra các quy trình điều khiển trực quan, toàn vẹn, giảm thiểu sự phụ thuộc vào các tương tác bên ngoài agent.
Nếu không tính đến yếu tố hiệu năng, tôi rất muốn triển khai mỗi quái vật và NPC đều chạy trên dịch vụ riêng biệt. Tuy nhiên qua đánh giá thực tế, giải pháp này không khả thi. Vấn đề này đã từng được đề cập ở phần cuối bài viết trước, hôm nay tôi xin chia sẻ chi tiết hơn về giải pháp mới.
Giải pháp tôi đang xây dựng sẽ tách riêng cơ chế di chuyển của quái vật để giảm tải áp lực cho hệ thống AI. Cụ thể, mỗi quái vật trên bản đồ có thể được thiết lập hành vi tuần tra theo lộ trình nhất định hoặc đứng yên tại chỗ. Khi không có tác động từ người chơi, cơ chế này sẽ đảm bảo tiêu hao tài nguyên hệ thống ở mức tối thiểu.
Tôi không lựa chọn phương án dừng hoàn toàn hoạt động của quái vật khi không có người chơi quan sát vì điều này có thể làm tăng độ phức tạp trong triển khai và khó đảm bảo tính nhất quán với ý đồ thiết kế ban đầu.
Giải pháp tối ưu là tách biệt hệ thống điều khiển di chuyển thành module riêng biệt, giúp kiểm soát hiệu quả mức độ tiêu hao tài nguyên. Việc phân tách này đồng thời giúp đơn giản hóa quy trình thực hiện.
Cấu trúc hệ thống con này như sau:
- Khả năng nhận yêu cầu tạo dựng quái vật trên từng bản đồ riêng biệt
- Chỉ tập trung quản lý tọa độ của các đối tượng quái vật
- Sử dụng cơ chế ShareDB để đồng bộ hóa vị trí với các dịch vụ khác
- Tính linh hoạt cao khi có thể áp dụng cho mọi loại quái vật dù cấu trúc khác biệt
Khi đối tượng quái vật được tạo ra, hệ thống cho phép gán các hành vi cụ thể như: đứng yên, tuần tra, hoặc bám sát đối tượng khác. Hệ thống sẽ cập nhật vị trí các đối tượng theo chu kỳ cố định (ví dụ mỗi giây một lần) và thông báo đến các agent người chơi thông qua cơ chế đa điểm.
Làm thế nào để hệ thống con này phối hợp với hệ thống chính? Hệ thống chính ở đây chính là server bản đồ, nơi chứa module AI quái vật được kích hoạt khi có agent người chơi tương tác. Điều này có nghĩa module AI sẽ không tiêu hao tài nguyên CPU khi không có người chơi kích hoạt. Khi tạo quái vật, hệ thống đồng thời thông báo đến module con để đối tượng có thể tự di chuyển trong bản đồ.
Quy trình xử lý diễn ra như sau:
- Khi quái vật di chuyển tự do qua hệ thống con, có thể kích hoạt logic xử lý thông qua hệ thống AOI khi vào tầm nhìn của người chơi
- Khi module AI quái vật được kích hoạt, nó sẽ yêu cầu hệ thống con xóa đối tượng và chuyển sang chế độ điều khiển AI
- Hệ thống con có thể được triển khai trên tiến trình và CPU riêng với tần suất cập nhật điều chỉnh linh hoạt
- Việc phân tách này giúp giảm thiểu tác động đến hiệu năng tổng thể, chỉ phụ thuộc vào số lượng người chơi trên bản đồ
Đặc biệt với các đối tượng phức tạp như boss trong phụ bản, chúng tôi vẫn có thể triển khai dịch vụ agent độc lập mà không mâu thuẫn với hệ thống hiện tại. Giải pháp này mang đến tính mở rộng cao, cho phép tùy chỉnh linh hoạt cho từng loại đối tượng trong game.