背景:我正在开发一个小游戏,并利用玩家的延迟来做延迟补偿。该游戏是开源的,因此目前对系统进行逆向工程并延迟响应时间以人为增加报告的延迟是一项非常容易的任务,从而可能导致不公平的优势。
我当前的延迟检索策略是:
- 每个固定间隔我都会向玩家发送一条标记为“ping”的消息。(这与ICMP无关)
- 此 ping 消息由一个特殊的“ping”操作码和一个带有序列号的有效负载组成
- 一旦客户端收到所述消息,他就会发回一个带有“pong”操作码和具有相同序列号的有效负载
- 当服务器收到标记为“pong”的消息时,它会计算发送和接收之间经过了多少时间。这是往返时间
- 我们的延迟是 rtt / 2
在伪代码中
服务器:
function now() {
return current UTC time in millis
}
i = 0
function nextSequence() {
return i++
}
sendingTimestamps = []
function onPingEvent() {
id = nextSequence()
sendingTimestamps[id] = now()
sendPingMessage(id)
}
function onPongReceived(id) {
received = now()
sent = sendingTimestamps[id]
rtt = received - sent
latency = rtt / 2
}
客户:
function onPingReceived(id) {
sendPongMessage(id)
}
正如你所看到的,客户很容易在他的代码中添加一个延迟来夸大他报告的延迟。
有没有更好的方法来让客户延迟以减少他们作弊的空间?