Tôi đang triển khai tính năng chống gian lận cơ bản (chỉ dành cho kiddies) cho trò chơi của mình. Tôi đã bao gồm một dấu thời gian cho mỗi gói chuyển động của tôi và kiểm tra sanity ở phía máy chủ để có sự khác biệt về thời gian giữa các gói đó.Vòng lặp x giây một lần dựa trên tốc độ xử lý
Tôi cũng đã bao gồm gói gửi dấu thời gian cứ sau 5 giây dựa trên tốc độ xử lý. Nhưng có vẻ như đây là một vấn đề khi PC bị trễ.
Vì vậy, tôi nên sử dụng thông tin gì để kiểm tra xem thời gian xử lý có nhanh hơn do "hack tốc độ" không?
hiện kiểm tra tốc độ vòng lặp của tôi trên máy khách:
this_time = clock();
time_counter += (double)(this_time - last_time);
last_time = this_time;
if (time_counter > (double)(5 * CLOCKS_PER_SEC))
{
time_counter -= (double)(5 * CLOCKS_PER_SEC);
milliseconds ms = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
uint64_t curtime = ms.count();
if (state == WALK) {
// send the CURTIME to server
}
}
// other game loop function
Đoạn mã trên hoạt động tốt nếu khách hàng PC không tụt hậu có lẽ vì RAM hoặc CPU vấn đề này. Họ có thể đang chạy quá nhiều ứng dụng.
server side code để tham khảo: (GoLang)
// pktData[3:] packet containing the CURTIME from client
var speed = pickUint64(pktData, 3)
var speedDiff = speed - lastSpeed
if lastSpeed == 0 {
speedDiff = 5000
}
lastSpeed = speed
if speedDiff < 5000 /* 5000 millisec or 5 sec */ {
c.hackDetect("speed hack") // hack detect when speed is faster than the 5 second send loop in client
}
Tôi đang sử dụng VisualStudio2015 – majidarif
@MikeMB không tôi đã không cố gắng steady_clock – majidarif
Mã của bạn gửi 'thời gian system_clock' máy tính của khách hàng - họ có thể không được đồng bộ hóa máy tính của họ với bất kỳ tài liệu tham khảo (thậm chí nếu bạn có), trong trường hợp có mà có thể là một đồng bằng giữa thời gian máy chủ của bạn và của chúng, ngay cả khi không có bất kỳ sự chậm trễ nào liên quan đến tải. Bạn sẽ tốt hơn trong việc xử lý thông điệp của họ là "nhịp tim" - mong đợi mỗi người trong vòng 10 giây sau cùng. –