Hiện Tại, Bản Dự Thảo Thiết Kế Tầng Logic Của Máy Chủ Trò Chơi Của Chúng Tôi - nói dối e blog

Hiện Tại, Bản Dự Thảo Thiết Kế Tầng Logic Của Máy Chủ Trò Chơi Của Chúng Tôi

Hiện tại, hệ thống logic server game của chúng tôi đang được thiết kế theo hướng tiếp cận mới. Ban đầu, chúng tôi xây dựng lớp logic dựa trên cơ chế truyền tải gói tin mạng. Cụ thể, client sẽ định nghĩa cấu trúc thông điệp, đóng gói dữ liệu và gửi đi, sau đó server sẽ giải mã các gói tin này để xử lý tương ứng.

Tuy nhiên, sau một thời gian phát triển, chúng tôi nhận thấy phương pháp này trở nên lộn xộn và khó kiểm soát khi dự án ngày càng phức tạp. Qua thảo luận với đồng nghiệp, chúng tôi đã quyết định chuyển sang mô hình RPC không đồng bộ (Asynchronous RPC) để tối ưu hóa quy trình xử lý.

Hệ thống mới hoạt động như sau: Server xử lý logic sẽ gọi phương thức từ xa (remote method) trên client để tạo ra các đối tượng bóng (shadow object) chỉ dùng để hiển thị hình ảnh. Khi server cần client phản hồi bằng các hiệu ứng thị giác, thay vì truyền thống gửi gói tin thô, hệ thống sẽ trực tiếp gọi phương thức từ xa của đối tượng bóng này. Cách tiếp cận này giúp code logic trở nên rõ ràng hơn hẳn, gần như không cần quan tâm đến tầng mạng, tương tự như việc lập trình game đơn giản trên nền tảng standalone.

Về bản chất, hệ thống này không khác biệt nhiều so với phương pháp truyền thống, nhưng về mặt biểu đạt lại tự nhiên và trực quan hơn nhiều. Điều này tương tự như việc bạn có thể lập trình hướng đối tượng bằng C, nhưng rõ ràng C++ sẽ mang lại trải nghiệm tự nhiên hơn nhiều. Trong hệ thống mới, engine đã đóng gói toàn bộ việc quản lý đối tượng, giúp lập trình viên không còn phải xử lý các ID số khó chịu. Đồng thời, hệ thống cũng ẩn đi các vấn đề phức tạp liên quan đến việc gửi/broadcast thông điệp.

Chúng tôi tách biệt rõ ràng giữa nhân vật do người chơi điều khiển và nhân vật tồn tại trên server. Nói cách khác, “bạn” trong mắt server và “bạn” mà bạn nhìn thấy trên client là hai thực thể riêng biệt. Khi bạn thao tác nhân vật của mình, client sẽ gửi lệnh thông qua phương thức từ xa của bộ điều khiển (controller). Ngược lại, server sẽ cập nhật trạng thái cho tất cả client bằng cách gọi phương thức từ xa của từng nhân vật.

Điều này có nghĩa là client luôn sử dụng controller để thông báo hành động tới server thông qua các phương thức từ xa, trong khi server xử lý logic bằng cách gọi phương thức từ xa của các đối tượng logic. Engine sẽ tự động broadcast các thông điệp này theo nhu cầu kết nối, đảm bảo các đối tượng bóng trên từng client đều nhận được thông tin cập nhật trạng thái.

Đây là thành quả của hơn nửa tháng làm việc cùng đồng nghiệp. Đặc biệt, nhờ việc sử dụng script để viết logic, chúng tôi có thể xây dựng giao diện đẹp mắt hơn nhiều so với việc dùng C/C++.

Điểm nổi bật đầu tiên là hệ thống sử dụng file mô tả giao diện định nghĩa theo định dạng riêng. Công cụ tự phát triển sẽ tự động biên dịch thành code script tương ứng. Lập trình viên chỉ cần viết các lớp đối tượng trong script là có thể tự động xử lý các phương thức từ xa. Việc gọi phương thức từ xa cũng hoàn toàn giống với gọi phương thức cục bộ, mang lại trải nghiệm liền mạch - điều khó thực hiện khi dùng C/C++.

Thứ hai, engine đã tích hợp sẵn hệ thống quản lý đối tượng, tự động chuyển đổi giữa ID giao thức mạng và đối tượng logic. Điều này giúp lập trình viên không cần quan tâm đến các chi tiết底层.

Thứ ba, các kiểu dữ liệu như enum không còn cần phải định nghĩa bằng hằng số số hay script riêng. Chúng tôi cho phép định nghĩa trực tiếp trong file giao diện, sau đó engine sẽ xử lý để logic layer sử dụng chuỗi ký tự thân thiện mà vẫn đảm bảo hiệu suất.

Khi không còn phải bận tâm đến mạng, lập trình viên có thể tập trung vào các chi tiết gameplay. Một cải tiến quan trọng khác là cơ chế dự đoán hành vi để bù trừ độ trễ mạng. Trước đây, chúng tôi phải tích hợp thông tin timestamp vào giao thức cơ bản, sau đó tính toán độ trễ để suy đoán trạng thái hiện tại. Nay, thông tin thời gian được tích hợp vào RPC, mỗi phương thức từ xa tự động mang theo độ trễ, giúp tính toán dễ dàng hơn. Kết quả thử nghiệm cho thấy chiến lược đồng bộ vị trí với dự đoán này giúp người chơi chấp nhận được độ trễ lên đến 8 giây, và gần như không cảm nhận độ trễ dưới 1 giây.

Về vấn đề quản lý thông tin quan tâm của từng kết nối (interested information), chúng tôi đang nghiên cứu tách riêng thành tiến trình độc lập. Cụ thể, giữa server xử lý kết nối và server xử lý logic sẽ có một server trung gian chuyên quản lý các đối tượng mà từng client quan tâm. Nhiệm vụ này tuy đơn giản nhưng trọng yếu, việc tách riêng sẽ giảm đáng kể độ phức tạp cho server logic.

Hệ thống này không chỉ giúp tối ưu hiệu suất mà còn mở ra khả năng mở rộng trong tương lai. Chúng tôi đang tiếp tục hoàn thiện các công cụ hỗ trợ phát triển, hy vọng sẽ sớm chia sẻ thêm các cải tiến thú vị khác.

0%