Improved accuracy of networking ping calculation #77

This commit is contained in:
Collin Smith 2020-06-12 20:08:58 -07:00
parent cbfae0f702
commit eb2d672ac1
5 changed files with 34 additions and 12 deletions

View File

@ -17,22 +17,26 @@ public final class Ping extends Table {
public int tickCount() { int o = __offset(4); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
public long sendTime() { int o = __offset(6); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
public long processTime() { int o = __offset(8); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
public boolean ack() { int o = __offset(10); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }
public static int createPing(FlatBufferBuilder builder,
int tickCount,
long sendTime,
long processTime) {
builder.startObject(3);
long processTime,
boolean ack) {
builder.startObject(4);
Ping.addProcessTime(builder, processTime);
Ping.addSendTime(builder, sendTime);
Ping.addTickCount(builder, tickCount);
Ping.addAck(builder, ack);
return Ping.endPing(builder);
}
public static void startPing(FlatBufferBuilder builder) { builder.startObject(3); }
public static void startPing(FlatBufferBuilder builder) { builder.startObject(4); }
public static void addTickCount(FlatBufferBuilder builder, int tickCount) { builder.addInt(0, tickCount, 0); }
public static void addSendTime(FlatBufferBuilder builder, long sendTime) { builder.addLong(1, sendTime, 0L); }
public static void addProcessTime(FlatBufferBuilder builder, long processTime) { builder.addLong(2, processTime, 0L); }
public static void addAck(FlatBufferBuilder builder, boolean ack) { builder.addBoolean(3, ack, false); }
public static int endPing(FlatBufferBuilder builder) {
int o = builder.endObject();
return o;

View File

@ -49,8 +49,11 @@ public class NetworkProfiler extends IntervalBaseSystem implements Pinger.Packet
}
@Override
public void onPingResponse(Pinger pinger, Ping packet, long ping, long rtt) {
this.ping = ping;
this.rtt = rtt;
public void onPingResponse(Pinger pinger, Ping packet, long ping, long rtt, boolean ack) {
if (ack){
this.ping = ping;
} else {
this.rtt = rtt;
}
}
}

View File

@ -30,8 +30,8 @@ public class Pinger extends IntervalBaseSystem {
// it may be possible to use Gdx.graphics.getFrameId() -- but that isn't related to engine tick
private int tick;
public long ping;
public long rtt;
private long ping;
private long rtt;
public Pinger() {
super(1.0f);
@ -40,7 +40,7 @@ public class Pinger extends IntervalBaseSystem {
@Override
protected void processSystem() {
FlatBufferBuilder builder = new FlatBufferBuilder(0);
int dataOffset = Ping.createPing(builder, tick++, TimeUtils.millis(), 0);
int dataOffset = Ping.createPing(builder, tick++, TimeUtils.millis(), 0, false);
int root = D2GS.createD2GS(builder, D2GSData.Ping, dataOffset);
D2GS.finishSizePrefixedD2GSBuffer(builder, root);
@ -65,10 +65,11 @@ public class Pinger extends IntervalBaseSystem {
}
private void notifyPing(Ping packet, long ping, long rtt) {
for (PacketListener l : packetListeners) l.onPingResponse(this, packet, ping, rtt);
boolean ack = packet.ack();
for (PacketListener l : packetListeners) l.onPingResponse(this, packet, ping, rtt, ack);
}
public interface PacketListener {
void onPingResponse(Pinger pinger, Ping packet, long ping, long rtt);
void onPingResponse(Pinger pinger, Ping packet, long ping, long rtt, boolean ack);
}
}

View File

@ -27,4 +27,5 @@ table Ping {
processTime:int64;
// response
ack:bool;
}

View File

@ -537,7 +537,7 @@ public class D2GS extends ApplicationAdapter {
private void Ping(Packet packet) {
Ping ping = (Ping) packet.data.data(new Ping());
FlatBufferBuilder builder = new FlatBufferBuilder(0);
int dataOffset = Ping.createPing(builder, ping.tickCount(), ping.sendTime(), TimeUtils.millis() - packet.time);
int dataOffset = Ping.createPing(builder, ping.tickCount(), ping.sendTime(), TimeUtils.millis() - packet.time, false);
int root = com.riiablo.net.packet.d2gs.D2GS.createD2GS(builder, D2GSData.Ping, dataOffset);
com.riiablo.net.packet.d2gs.D2GS.finishSizePrefixedD2GSBuffer(builder, root);
Packet response = Packet.obtain(1 << packet.id, builder.dataBuffer());
@ -706,6 +706,19 @@ public class D2GS extends ApplicationAdapter {
if (!success) {
Gdx.app.log(TAG, "failed to add to queue -- closing " + socket.getRemoteAddress());
kill = true;
} else if (packet.data.dataType() == D2GSData.Ping) {
try {
Ping ping = (Ping) packet.data.data(new Ping());
FlatBufferBuilder builder = new FlatBufferBuilder(0);
int dataOffset = Ping.createPing(builder, ping.tickCount(), ping.sendTime(), 0, true);
int root = com.riiablo.net.packet.d2gs.D2GS.createD2GS(builder, D2GSData.Ping, dataOffset);
com.riiablo.net.packet.d2gs.D2GS.finishSizePrefixedD2GSBuffer(builder, root);
Packet response = Packet.obtain(1 << packet.id, builder.dataBuffer());
if (DEBUG_SENT_PACKETS && !ignoredPackets.get(packet.data.dataType())) Gdx.app.log(TAG, "dispatching " + D2GSData.name(packet.data.dataType()) + " ACK packet to " + String.format("0x%08X", packet.id));
send(response);
} catch (Throwable t) {
Gdx.app.log(TAG, t.getMessage(), t);
}
}
} catch (Throwable t) {
Gdx.app.log(TAG, t.getMessage(), t);