mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-02-09 10:28:25 +07:00
Improved accuracy of networking ping calculation #77
This commit is contained in:
parent
cbfae0f702
commit
eb2d672ac1
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -27,4 +27,5 @@ table Ping {
|
||||
processTime:int64;
|
||||
|
||||
// response
|
||||
ack:bool;
|
||||
}
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user