Tôi đang làm việc trên một game bắn súng từ trên xuống 2D và cố gắng hết sức để sao chép các khái niệm được sử dụng trong các trò chơi nối mạng như Quake 3.
- Tôi có một máy chủ có thẩm quyền.
- Máy chủ gửi ảnh chụp nhanh cho khách hàng.
- Ảnh chụp nhanh chứa dấu thời gian và vị trí thực thể.
- Các thực thể được nội suy giữa các vị trí chụp nhanh để chuyển động trông trơn tru.
- Do sự cần thiết, phép nội suy thực thể xảy ra hơi "trong quá khứ" để chúng ta có nhiều ảnh chụp nhanh để nội suy giữa.
Vấn đề tôi gặp phải là "đồng bộ hóa đồng hồ".
- Để đơn giản, hãy giả vờ một chút rằng không có độ trễ bằng 0 khi chuyển gói đến và từ máy chủ.
- Nếu đồng hồ máy chủ đi trước 60 giây so với đồng hồ máy khách, thì dấu thời gian chụp nhanh sẽ vượt 60000ms so với dấu thời gian cục bộ của máy khách.
- Do đó, các ảnh chụp thực thể sẽ thu thập và ngồi trong khoảng 60 giây trước khi khách hàng thấy bất kỳ thực thể cụ thể nào thực hiện các bước di chuyển của mình, bởi vì phải mất nhiều thời gian để đồng hồ khách bắt kịp.
Tôi đã cố gắng khắc phục điều này bằng cách tính toán sự khác biệt giữa đồng hồ máy chủ và máy khách mỗi khi nhận được ảnh chụp nhanh.
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
Khi xác định khoảng cách nội suy của thực thể là bao xa, tôi chỉ cần thêm sự khác biệt vào thời gian hiện tại của khách hàng. Tuy nhiên, vấn đề với điều này là nó sẽ gây ra hiện tượng giật vì sự khác biệt giữa hai đồng hồ sẽ đột ngột dao động do ảnh chụp nhanh đến / chậm hơn so với các đồng hồ khác.
Làm cách nào tôi có thể đồng bộ hóa các đồng hồ đủ chặt chẽ để độ trễ duy nhất có thể nhận biết được là mã hóa cứng để nội suy và nguyên nhân gây ra bởi độ trễ mạng thông thường?
Nói cách khác, làm thế nào tôi có thể ngăn nội suy bắt đầu quá muộn hoặc quá sớm khi đồng hồ bị đồng bộ hóa đáng kể, mà không gây ra hiện tượng giật?
Chỉnh sửa: Theo Wikipedia , NTP có thể được sử dụng để đồng bộ hóa đồng hồ qua internet trong vòng vài mili giây. Tuy nhiên, giao thức có vẻ phức tạp và có lẽ quá mức cần thiết để sử dụng trong các trò chơi?