Nếu hai bên chỉ trao đổi “đi tới đây” còn đường đi thì mỗi bên tự tính, chỉ cần tính lệch một chút là nhân vật hay quái sẽ đi theo đường khác rồi bị kéo về chỗ cũ.
Vì sao Khi click để di chuyển hoặc khi quái đuổi theo, chỉ gửi điểm đến còn đường đi thì client tự tính riêng → Dẫn đến Do khác biệt dữ liệu địa hình, va chạm với nhân vật khác, khác thứ tự tính toán mà đi theo đường khác với server → Trên màn hình Quái đi xuyên tường rồi bị dời đi chỗ khác trong nháy mắt, nhân vật di chuyển theo click đổi hướng như đang trượt
Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Phát triển client (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Server: gửi kèm cả các điểm trung gian (waypoint) của đường đi, đồng bộ vị trí định kỳ. Client: cho sai lệch hội tụ dần một cách mượt mà, dùng cùng dữ liệu địa hình với server.
Trên đồ thị
Thỉnh thoảng vọt lên bất chợt · Số lần và khoảng cách hiệu chỉnh vị trí theo đối tượng
Chỗ cần xem
Ghi lại chênh lệch giữa vị trí server gửi và vị trí client tính cho từng đối tượng, rồi chấm tọa độ xảy ra hiệu chỉnh lên bản đồ. Tóm tắt kết quả đường đi hoặc vị trí của hai bên bằng checksum rồi so sánh định kỳ thì tìm được thời điểm bắt đầu lệch
Đúng nếu
hiệu chỉnh dồn vào một địa hình cụ thể (bậc cửa, lối đi hẹp, dốc) hoặc nơi đông người, và lặp lại ở cùng vị trí ngay cả với người chơi có chỉ số mạng bình thường
Loại trừ nếu
chỉ hiệu chỉnh vào lúc mất gói hoặc jitter vọt lên, bất kể vị trí → vấn đề đường truyền. Một con quái cùng bị nhảy trên màn hình của nhiều người → xem quyền điều khiển quái có nằm ở client chậm không
Cách kiểm tra
Cần log và chỉ số của server, client game
Tìm hiểu thêm
Cách này là một trong những lý do khiến game click để di chuyển và game tab-target ít nhạy với ping. Đổi lại, không có gì bảo đảm kết quả hai bên giống nhau, nên nhất định phải có cơ chế thỉnh thoảng đồng bộ lại vị trí. Phép tính dấu phẩy động có thể cho kết quả hơi khác nhau tùy loại CPU, trình biên dịch và cấu hình tối ưu hóa của nó (kể cả khác biệt giữa bản build debug và release). Trong các cấu trúc chỉ trao đổi input và giả định kết quả tính toán hai bên giống hệt nhau như lockstep, rollback, những khác biệt nhỏ này có thể tích tụ lại và gây lệch (desync), khiến trạng thái game trên hai màn hình tách ra.
Nguồn
Deterministic LockstepGaffer On Games Dù tất định trên cùng một máy, kết quả dấu phẩy động vẫn có thể khác nhau khi trình biên dịch, OS, CPU khác nhau
State SynchronizationGaffer On Games Gửi trạng thái kèm với input thì có thể đồng bộ hai bên mà không cần tính tất định hoàn hảo
Peeking into VALORANT's NetcodeRiot Games Khi mất gói tin hoặc khi hai nhân vật cùng muốn đi vào một chỗ, mô phỏng trên server và client bị lệch nên cần hiệu chỉnh
Floating Point DeterminismGaffer On Games Cùng một đoạn code dấu phẩy động cũng có thể cho kết quả khác nhau tùy trình biên dịch, kiến trúc CPU, bản build debug hay release. Có trường hợp CPU AMD và Intel trả về giá trị hơi khác nhau ở hàm siêu việt
/fp (Specify floating-point behavior)Microsoft /fp:fast có thể đổi thứ tự hoặc gộp các phép tính dấu phẩy động nên kết quả khác với các cấu hình /fp khác, và phép tính được gộp bằng FMA cũng có thể khác với kết quả nhân rồi cộng riêng