Kiến trúc tổng thể

Ezytank áp dụng kiến trúc lai với ba thành phần chính: Máy chủ trung tâm (master server), Máy chủ gameplay (gameplay server), và Ứng dụng khách gameplay (gameplay client). Thiết kế này giúp phân tách rõ ràng giữa các nghiệp vụ backend và logic trò chơi thời gian thực, đồng thời tận dụng ưu điểm của cả hai loại máy chủ và ứng dụng khách.

ezytank-Overview.jpg

Máy chủ trung tâm (master server)

Máy chủ trung tâm chịu trách nhiệm xử lý các tác vụ không yêu cầu thời gian thực và logic backend. Nó được phát triển bằng Ezyplatform giúp tái sử dụng các plugins có sẵn như ezymail, ezylogin, ezygame, nhằm tăng tốc quá trình phát triển. Một số nghiệp vụ nổi bật là:

  • Quản lý dữ liệu lâu dài như thông tin người chơi, phòng chơi
  • Xử lý xác thực, sảnh chờ và các nghiệp vụ backend khác
  • Quản lý và điều phối các máy chủ gameplay

Máy chủ gameplay (gameplay server)

Các máy chủ gameplay chịu trách nhiệm mô phỏng thời gian thực và xử lý gameplay đa người chơi. Mỗi máy chủ gameplay xử lý một trận đấu riêng biệt của một phòng và được phát triển bằng Unity netcode for entities với các ưu điểm:

  • Xử lý hiệu năng cao dựa trên các công nghệ lập trình hướng dữ liệu của Unity - Data-Oriented Technology Stack (DOTS)
  • Mô phỏng vật lý tất định, nghĩa là các kết quả mô phỏng vật lý như va chạm, quán tính sẽ luôn giống nhau nếu bắt đầu từ cùng một trạng thái ban đầu và có cùng chuỗi hành động, bất kể được chạy trên máy tính nào. Ví dụ, nếu 2 xe tăng va chạm ở cùng vị trí và tốc độ, thì trên mọi máy chơi, kết quả va chạm sẽ luôn giống nhau, không bị lệch như trong vật lý không tất định.
  • Hỗ trợ nhiều giao thức truyền tải: UDP, TCP, và WebSocket

Ứng dụng khách gameplay (gameplay client)

Ứng dụng khách gameplay là nơi người chơi tương tác trực tiếp với trò chơi. Nó cũng được xây dựng bằng Unity netcode for entities, kết nối tới máy chủ gameplay để nhận và gửi dữ liệu thời gian thực, đồng thời thực hiện hiển thị hình ảnh và xử lý đầu vào từ người dùng. Một số nghiệp vụ chính gồm:
  • Hiển thị giao diện trò chơi, bao gồm xe tăng, hiệu ứng và HUD
  • Gửi các hành động của người chơi (như di chuyển, tấn công) tới máy chủ gameplay để xử lý
  • Đồng bộ trạng thái trò chơi thông qua dữ liệu nhận từ máy chủ gameplay
  • Tận dụng Unity DOTS để xử lý hiệu quả các thành phần có nhiều thực thể (entities), ví dụ như xe tăng hoặc đạn

Việc sử dụng cùng công nghệ Unity netcode for entities ở cả phía máy chủ gameplay và ứng dụng khách giúp đảm bảo tính nhất quán trong mô phỏng và đồng bộ dữ liệu, đồng thời giảm độ trễ trong trải nghiệm của người chơi bằng các kỹ thuật như Client Prediction, Job System, thiết kế và lập trình hướng dữ liệu. Các kỹ thuật này chúng tôi sẽ nói kỹ hơn ở các bài viết sau.

Chi tiết hơn về máy chủ trung tâm

Máy chủ trung tâm của EzyTank bao gồm các thành phần chính sau:
  • Admin plugin: hỗ trợ các nghiệp vụ quản trị cơ bản của EzyPlatform dành cho quản trị viên hoặc người vận hành, như quản lý người dùng, plugin, cài đặt hệ thống. Ngoài ra, còn bao gồm các nghiệp vụ riêng của EzyTank như quản lý các máy chủ gameplay và cấu hình apiKey.
  • Web plugin: xử lý các nghiệp vụ web qua giao thức HTTP dành cho người dùng cuối, bao gồm xác thực, đăng nhập, v.v. Plugin này tái sử dụng ezylogin và ezymail từ chợ EzyPlatform.
  • Theme: cung cấp giao diện landing page cho ezytank và serve ứng dụng khách gameplay

Phần lớn các nghiệp vụ cơ bản được tái sử dụng từ các plugin có sẵn trên chợ EzyPlatform. Riêng phần quản lý máy chủ gameplay trong Admin plugin được tóm tắt như sau:

ezytank-Room management.jpg
  • Quản trị viên có thể dễ dàng thêm các máy chủ gameplay, mỗi máy chủ gameplay là một máy chủ Unity.
  • Các máy chủ Unity sẽ gửi các HTTP request đến Admin plugin để cập nhật trạng thái hoạt động.
  • Các request này sẽ được xác thực thông qua một apiKey.

Chi tiết hơn về máy chủ gameplay

Máy chủ gameplay chịu trách nhiệm xử lý các nghiệp vụ chuyên biệt cho trò chơi, cũng như xác thực người chơi trước khi cho phép họ kết nối vào hệ thống. Phần nghiệp vụ gameplay sẽ được trình bày chi tiết ở các bài viết sau. Dưới đây là tổng quan quy trình handshake để đảm bảo chỉ những người chơi đã được xác thực mới có thể kết nối vào máy chủ:

ezytank-Handshake process.jpg
  • Người chơi đăng nhập qua web plugin, sử dụng ezylogin từ EzyPlatform.
  • Sau khi đăng nhập thành công, người chơi nhận được một token cùng danh sách các phòng (room) có thể tham gia.
  • Khi người chơi chọn một phòng, ứng dụng khách sẽ gửi yêu cầu tham gia phòng đến máy chủ Unity, kèm theo token.
  • Máy chủ Unity sẽ gọi lại web plugin để xác thực token này.
  • Nếu token hợp lệ, người chơi sẽ được phép tham gia vào phòng.