Truyền Thông Tin Từ Máy Chủ Trong Game MMO
Trong hệ thống engine của game MMO, một trong những vấn đề quan trọng nhất cần giải quyết là làm thế nào để thông báo chính xác các thay đổi trạng thái trong thế giới ảo đến đúng những người chơi cần biết thông tin đó.
Thông thường, mỗi người chơi sẽ được thiết lập một vùng quan tâm (AOI - Area Of Interest). Khi một đối tượng thay đổi trạng thái, hệ thống sẽ phát đi thông tin này đến tất cả người chơi có vùng quan tâm bao phủ đối tượng đó. Tuy nhiên, trong hệ thống game hiện tại, mô hình AOI đơn giản không còn phù hợp với các tình huống phức tạp hơn.
Ví dụ điển hình là cơ chế ẩn thân của sát thủ trong game World of Warcraft. Dù nhân vật này đã tiếp cận rất gần, người chơi vẫn không thể nhìn thấy họ. Mặc dù có thể xử lý logic này ở phía client (chỉ cần không hiển thị nhân vật ẩn thân), nhưng engine vẫn phải phát đi thông tin di chuyển của sát thủ. Cách này phù hợp với client trung thực, nhưng về mặt lý thuyết lại tạo lỗ hổng cho việc “bắt sóng” nhân vật ẩn thân. Do đó, chúng ta cần một giải pháp tốt hơn để engine chỉ gửi thông tin đến những client thực sự cần nhận, đồng thời không làm engine bị vướng vào các logic game phức tạp.
Giải pháp đề xuất
Trong hệ thống AOI cơ bản, engine chỉ biết tọa độ vị trí của các đối tượng. Để tạo ra các tầm nhìn khác nhau cho từng người chơi, chúng ta cần bổ sung thêm tham số “bán kính quan sát” cho mỗi người chơi. Tuy nhiên, với các trường hợp phức tạp như ẩn thân, dữ liệu này vẫn chưa đủ.
Hệ thống tôi hình dung sẽ sử dụng mô hình “radar” với hai tham số cho người quan sát (observer):
- Bán kính radar (Radar Radius): Khoảng cách tối đa mà người chơi có thể phát hiện đối tượng
- Cường độ radar (Radar Intensity): Khả năng phân biệt kích thước đối tượng ở một khoảng cách nhất định
Còn đối với đối tượng bị quan sát (observed object), chúng ta cần thêm tham số:
- Bán kính tín hiệu (Signal Radius): Mức “độ dễ phát hiện” của đối tượng, không liên quan đến kích thước mô hình thực tế
Với bộ tham số này, engine có thể tính toán chính xác liệu một người chơi có thể phát hiện một đối tượng hay không. Các giá trị này thường là cố định, nhưng có thể thay đổi theo logic game (ví dụ qua trang bị, buff, nâng cấp kỹ năng…). Điều quan trọng là engine không cần hiểu logic thay đổi này - chỉ cần sử dụng các giá trị hiện tại để tính toán.
Ứng dụng thực tế
Chúng ta có thể gắn các thuộc tính này lên từng đối tượng trong game. Engine sẽ dựa vào đó để quyết định đối tượng nào cần nhận các phương thức từ xa (remote method). Để tối ưu hiệu suất mạng, mỗi phương thức từ xa có thể được gắn thêm một hệ số trọng số.
Ví dụ:
- Hành động “vẫy tay” (emote) có thể được gán hệ số tín hiệu thấp
- Khi hai người chơi cách nhau 500m, có thể nhìn thấy hình dáng đối phương nhưng chưa nhận được hành động vẫy tay
- Chỉ khi khoảng cách thu ngắn còn 250m, thông tin vẫy tay mới được gửi đi
Triển vọng ứng dụng
Hệ thống này đặc biệt hữu ích cho các game MMO góc nhìn thứ nhất 3D. Tôi được biết một dự án khác của công ty đã gặp khó khăn trong việc giải quyết vấn đề này, nên viết bài này để ghi lại ý tưởng thiết kế một hệ thống truyền thông tin thông minh và hiệu quả.