Đồng Bộ Khóa Bước Trong Thiết Kế Game Mạng
Sáng nay, tôi muốn chia sẻ một chủ đề thú vị liên quan đến hệ thống đồng bộ game mạng dựa trên cơ chế lockstep. Chủ đề này được khơi gợi từ một cuộc trò chuyện tuần trước với nhóm phát triển MOBA đang gặp vấn đề với độ chính xác timer của khung skynet. Họ phàn nàn rằng timer của skynet chỉ đạt độ phân giải 10ms (100Hz), không đủ đáp ứng yêu cầu “đồng bộ khung hình” cho dự án của họ. Nhóm này cho rằng họ cần server đẩy dữ liệu về client theo chu kỳ cố định 66ms (tương đương 15Hz), nhưng skynet chỉ có thể trigger event ở các mốc 60ms hoặc 70ms, điều này ảnh hưởng đến “cảm giác chơi game”.
Sau khi trao đổi kỹ, tôi nhận thấy có sự hiểu lầm nào đó về bản chất thuật toán đồng bộ khóa bước. Về mặt nguyên tắc, client không nên phụ thuộc vào việc server đẩy dữ liệu đúng thời điểm để có “cảm giác tốt”. Dù skynet cho phép xây dựng service thay thế timer gốc để đạt độ chính xác 15Hz, nhưng việc server phụ thuộc vào timer chính xác là sai lầm trong thiết kế game. Trách nhiệm mang lại trải nghiệm cảm giác tinh tế hoàn toàn thuộc về client.
Hiểu đúng về Lockstep
Cái tên “đồng bộ khung hình” thường được dịch từ thuật ngữ lockstep, cùng với khái niệm đối lập “đồng bộ trạng thái” (tôi đã nghe thuật ngữ này nhiều lần trong các buổi phỏng vấn), thực chất là sự hiểu sai bản chất thuật toán. Đây là ví dụ điển hình của việc gán ghép máy móc các thuật ngữ thực tiễn từ ngành game phương Tây vào mô hình do chính mình xây dựng.
Nhắc đến chuyện thuật ngữ, tuần trước tôi có dịp dự tiệc cùng nhóm bạn làm blockchain. Họ than phiền về tình trạng dịch thuật hỗn loạn trong cộng đồng kỹ thuật Việt Nam. Chẳng hạn bản dịch luận văn Bitcoin của Satoshi Nakamoto phổ biến ở Việt Nam dịch sai thuật ngữ “transaction” thành “giao dịch”, dẫn đến hiểu lầm nghiêm trọng cho nhiều kỹ sư không đọc nguyên bản tiếng Anh. Điều này khiến việc trao đổi kỹ thuật trở nên khó khăn.
Tôi ưu tiên dịch “lockstep” theo nghĩa gốc: thuật toán khóa bước. Đây là thuật ngữ quân sự mô tả hành quân đồng bộ kiểu duyệt binh - tất cả thành viên trong đội hình đều thực hiện cùng một cử chỉ, bước đi đồng nhất. Trong bối cảnh game mạng, thuật ngữ này ám chỉ việc tất cả thiết bị trên mạng phải thực thi cùng một thao tác, đạt trạng thái giống hệt nhau. Vấn đề không nằm ở thời gian thực mà là sự thống nhất hành động. Điều này giống như trải nghiệm tập luyện đội ngũ trong quân đội - những động tác đơn điệu, chậm rãi đến mức khó chịu, cho đến khi có lệnh bằng còi hoặc khẩu hiệu thì toàn đội mới hành động nhịp nhàng.
Lịch sử phát triển và nguyên lý hoạt động
Ngày nay, dù game mạng đã tiến từ LAN game sang Internet, nhưng các hệ thống thuần lockstep ngày xưa đã được cải tiến để xử lý trễ mạng, độ trễ không ổn định. Tuy nhiên, bài viết này sẽ tập trung vào bản chất cơ bản của lockstep, giúp bạn nắm được nguyên lý cốt lõi để tự phát triển cải tiến.
Lockstep xuất hiện đầu tiên trong các game RTS (Real-Time Strategy) trên LAN. Môi trường LAN có độ trễ mạng rất thấp nên không cần xét đến yếu tố nhiễu sóng. Mô hình đơn giản nhất là biến game thời gian thực thành dạng “vòng tròn” (turn-based). Tưởng tượng như hai người chơi cờ vua, nhưng thay vì luân phiên đi từng nước, cả hai cùng suy nghĩ cho vòng này, ẩn các nước đi rồi đồng thời công bố để hệ thống tính toán bước phát triển tiếp theo.
Một ví dụ thú vị là tựa game kinh điển Diplomacy năm 1959 mô phỏng Thế Chiến thứ nhất (rất khuyến khích trải nghiệm, có bản online). Một ví dụ mới hơn là phiên bản boardgame Game of Thrones. Điều khiến game thủ không cảm thấy “dạng vòng tròn” nằm ở chu kỳ cực ngắn của mỗi vòng. Như trong Supreme Commander (tiếp nối tinh thần từ game AOE), chu kỳ logic chỉ là 10fps, thấp hơn nhiều so với tốc độ render đồ họa.
Cơ chế vận hành chi tiết
Người chơi có thể nhập lệnh ở tầng giao diện người dùng (user layer), nhưng lệnh sẽ được đưa vào hàng đợi để chờ xử lý đồng bộ. Trong mô hình P2P, các lệnh này được đồng bộ giữa các client. Mỗi máy client đồng thời là server chạy game engine. Khi thu thập đầy đủ lệnh từ tất cả người chơi trong vòng này, hệ thống sẽ tiến hành tính toán bước tiếp theo một cách nhất quán.
Lưu ý rằng “không hành động” cũng là một hành động hợp lệ. Mỗi vòng phải đảm bảo thu thập đầy đủ lệnh từ tất cả người chơi. Trong LAN, việc đồng bộ này diễn ra cực nhanh. Lệnh từ nhiều đơn vị của người chơi được gói gọn thành một thao tác (giống như trong Diplomacy, bạn có thể điều khiển tất cả đơn vị mình kiểm soát trong một vòng). Nếu có server trung tâm, lệnh sẽ được gửi đến server rồi broadcast lại.
Ở tầng đồ họa (presentation layer), client thực hiện nội suy mượt mà để tạo cảm giác liền mạch, dù chu kỳ logic có thể là 100ms. Điều này giải thích vì sao bạn không thấy nhân vật giật cục khi di chuyển dù xử lý logic có độ trễ.
Vai trò của thời gian trong hệ thống
Quan trọng nhất là hiểu rằng thời gian (100ms) không ảnh hưởng đến quá trình đồng bộ. Việc giới hạn thời gian cho mỗi vòng chỉ nhằm đảm bảo game tiến triển hợp lý. Như trong Diplomacy phiên bản bàn, nếu một vòng kéo dài 1 tiếng thì cả game sẽ chết vì thiếu nhịp độ. Trong game RTS, thời gian chờ thường là 100ms - nếu quá hạn mà không có lệnh, hệ thống coi như bạn chọn hành động “đứng yên”.
Giả sử một trận game RTS 10 phút có 6000 vòng (ở 10Hz). Về mặt lý thuyết, mỗi người chơi phải gửi 6000 lệnh hợp lệ. Miễn các lệnh này hợp lệ, không cần quan tâm chúng gửi lúc nào. Hệ thống đồng bộ dựa trên tính nhất quán của chuỗi lệnh, không dựa trên thời gian thực tế.
Ứng dụng trong các thể loại game khác
Trong game格斗 (game đối kháng), lockstep được áp dụng theo cách đặc biệt. Lấy ví dụ từ Dead or Alive (DOA) với chu kỳ logic 60fps. Mỗi kỹ năng có thời gian chuẩn bị (startup frame) và phục hồi (recovery frame). Ví dụ kỹ năng P của nhân vật Kasumi có chỉ số 9(2)13: 9 frame chuẩn bị, 2 frame đánh trúng, 13 frame phục hồi. Với 9 frame (~150ms), hệ thống đủ thời gian xử lý độ trễ mạng.
Client xử lý hai trạng thái song song: trạng thái xác định dựa trên dữ liệu đối thủ đã