From 05d153a18c69bacd5fe495a3bacd8065924bf95f Mon Sep 17 00:00:00 2001 From: Mark Vainomaa Date: Wed, 17 Apr 2019 09:24:38 +0300 Subject: [PATCH] Speed up packet construction diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java index 87093807..f55b846a 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java @@ -53,6 +53,7 @@ public enum Protocol { TO_SERVER.registerPacket( Handshake.class, + Handshake::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x00 ) ); } @@ -64,6 +65,7 @@ public enum Protocol { TO_CLIENT.registerPacket( KeepAlive.class, + KeepAlive::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x00 ), map( ProtocolConstants.MINECRAFT_1_9, 0x1F ), map( ProtocolConstants.MINECRAFT_1_13, 0x21 ), @@ -71,18 +73,21 @@ public enum Protocol ); TO_CLIENT.registerPacket( Login.class, + Login::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x01 ), map( ProtocolConstants.MINECRAFT_1_9, 0x23 ), map( ProtocolConstants.MINECRAFT_1_13, 0x25 ) ); TO_CLIENT.registerPacket( Chat.class, + Chat::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x02 ), map( ProtocolConstants.MINECRAFT_1_9, 0x0F ), map( ProtocolConstants.MINECRAFT_1_13, 0x0E ) ); TO_CLIENT.registerPacket( Respawn.class, + Respawn::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x07 ), map( ProtocolConstants.MINECRAFT_1_9, 0x33 ), map( ProtocolConstants.MINECRAFT_1_12, 0x34 ), @@ -92,11 +97,13 @@ public enum Protocol ); TO_CLIENT.registerPacket( BossBar.class, + BossBar::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_9, 0x0C ) ); // Waterfall start TO_CLIENT.registerPacket( EntityEffect.class, + EntityEffect::new, // Waterfall - speed up packet construction map(ProtocolConstants.MINECRAFT_1_8, 0x1D), map(ProtocolConstants.MINECRAFT_1_9, 0x4C), map(ProtocolConstants.MINECRAFT_1_9_4, 0x4B), @@ -107,6 +114,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( EntityRemoveEffect.class, + EntityRemoveEffect::new, // Waterfall - speed up packet construction map(ProtocolConstants.MINECRAFT_1_8, 0x1E), map(ProtocolConstants.MINECRAFT_1_9, 0x31), map(ProtocolConstants.MINECRAFT_1_12, 0x32), @@ -117,6 +125,7 @@ public enum Protocol // Waterfall end TO_CLIENT.registerPacket( PlayerListItem.class, // PlayerInfo + PlayerListItem::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x38 ), map( ProtocolConstants.MINECRAFT_1_9, 0x2D ), map( ProtocolConstants.MINECRAFT_1_12_1, 0x2E ), @@ -125,12 +134,14 @@ public enum Protocol ); TO_CLIENT.registerPacket( TabCompleteResponse.class, + TabCompleteResponse::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x3A ), map( ProtocolConstants.MINECRAFT_1_9, 0x0E ), map( ProtocolConstants.MINECRAFT_1_13, 0x10 ) ); TO_CLIENT.registerPacket( ScoreboardObjective.class, + ScoreboardObjective::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x3B ), map( ProtocolConstants.MINECRAFT_1_9, 0x3F ), map( ProtocolConstants.MINECRAFT_1_12, 0x41 ), @@ -140,6 +151,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( ScoreboardScore.class, + ScoreboardScore::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x3C ), map( ProtocolConstants.MINECRAFT_1_9, 0x42 ), map( ProtocolConstants.MINECRAFT_1_12, 0x44 ), @@ -149,6 +161,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( ScoreboardDisplay.class, + ScoreboardDisplay::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x3D ), map( ProtocolConstants.MINECRAFT_1_9, 0x38 ), map( ProtocolConstants.MINECRAFT_1_12, 0x3A ), @@ -158,6 +171,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( Team.class, + Team::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x3E ), map( ProtocolConstants.MINECRAFT_1_9, 0x41 ), map( ProtocolConstants.MINECRAFT_1_12, 0x43 ), @@ -167,6 +181,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( PluginMessage.class, + PluginMessage::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x3F ), map( ProtocolConstants.MINECRAFT_1_9, 0x18 ), map( ProtocolConstants.MINECRAFT_1_13, 0x19 ), @@ -174,6 +189,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( Kick.class, + Kick::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x40 ), map( ProtocolConstants.MINECRAFT_1_9, 0x1A ), map( ProtocolConstants.MINECRAFT_1_13, 0x1B ), @@ -181,6 +197,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( Title.class, + Title::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x45 ), map( ProtocolConstants.MINECRAFT_1_12, 0x47 ), map( ProtocolConstants.MINECRAFT_1_12_1, 0x48 ), @@ -189,6 +206,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( PlayerListHeaderFooter.class, + PlayerListHeaderFooter::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x47 ), map( ProtocolConstants.MINECRAFT_1_9, 0x48 ), map( ProtocolConstants.MINECRAFT_1_9_4, 0x47 ), @@ -199,6 +217,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( EntityStatus.class, + EntityStatus::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x1A ), map( ProtocolConstants.MINECRAFT_1_9, 0x1B ), map( ProtocolConstants.MINECRAFT_1_13, 0x1C ), @@ -206,15 +225,18 @@ public enum Protocol ); TO_CLIENT.registerPacket( Commands.class, + Commands::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_13, 0x11 ) ); TO_CLIENT.registerPacket( ViewDistance.class, + ViewDistance::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_14, 0x41 ) ); TO_SERVER.registerPacket( KeepAlive.class, + KeepAlive::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x00 ), map( ProtocolConstants.MINECRAFT_1_9, 0x0B ), map( ProtocolConstants.MINECRAFT_1_12, 0x0C ), @@ -224,6 +246,7 @@ public enum Protocol ); TO_SERVER.registerPacket( Chat.class, + Chat::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x01 ), map( ProtocolConstants.MINECRAFT_1_9, 0x02 ), map( ProtocolConstants.MINECRAFT_1_12, 0x03 ), @@ -232,6 +255,7 @@ public enum Protocol ); TO_SERVER.registerPacket( TabCompleteRequest.class, + TabCompleteRequest::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x14 ), map( ProtocolConstants.MINECRAFT_1_9, 0x01 ), map( ProtocolConstants.MINECRAFT_1_12, 0x02 ), @@ -241,6 +265,7 @@ public enum Protocol ); TO_SERVER.registerPacket( ClientSettings.class, + ClientSettings::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x15 ), map( ProtocolConstants.MINECRAFT_1_9, 0x04 ), map( ProtocolConstants.MINECRAFT_1_12, 0x05 ), @@ -249,6 +274,7 @@ public enum Protocol ); TO_SERVER.registerPacket( PluginMessage.class, + PluginMessage::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x17 ), map( ProtocolConstants.MINECRAFT_1_9, 0x09 ), map( ProtocolConstants.MINECRAFT_1_12, 0x0A ), @@ -265,19 +291,23 @@ public enum Protocol { TO_CLIENT.registerPacket( StatusResponse.class, + StatusResponse::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x00 ) ); TO_CLIENT.registerPacket( PingPacket.class, + PingPacket::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x01 ) ); TO_SERVER.registerPacket( StatusRequest.class, + StatusRequest::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x00 ) ); TO_SERVER.registerPacket( PingPacket.class, + PingPacket::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x01 ) ); } @@ -289,35 +319,43 @@ public enum Protocol { TO_CLIENT.registerPacket( Kick.class, + Kick::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x00 ) ); TO_CLIENT.registerPacket( EncryptionRequest.class, + EncryptionRequest::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x01 ) ); TO_CLIENT.registerPacket( LoginSuccess.class, + LoginSuccess::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x02 ) ); TO_CLIENT.registerPacket( SetCompression.class, + SetCompression::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x03 ) ); TO_CLIENT.registerPacket( LoginPayloadRequest.class, + LoginPayloadRequest::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_13, 0x04 ) ); TO_SERVER.registerPacket( LoginRequest.class, + LoginRequest::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x00 ) ); TO_SERVER.registerPacket( EncryptionResponse.class, + EncryptionResponse::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x01 ) ); TO_SERVER.registerPacket( LoginPayloadResponse.class, + LoginPayloadResponse::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_13, 0x02 ) ); } @@ -368,7 +406,7 @@ public enum Protocol private final int protocolVersion; private final TObjectIntMap> packetMap = new TObjectIntHashMap<>( MAX_PACKET_ID ); - private final Constructor[] packetConstructors = new Constructor[ MAX_PACKET_ID ]; + private final java.util.function.Supplier[] packetConstructors = new java.util.function.Supplier[ MAX_PACKET_ID ]; // Waterfall - speed up packet construction } @Data @@ -436,21 +474,24 @@ public enum Protocol throw new BadPacketException( "Packet with id " + id + " outside of range " ); } - Constructor constructor = protocolData.packetConstructors[id]; + java.util.function.Supplier constructor = protocolData.packetConstructors[id]; // Waterfall - speed up packet construction try { - return ( constructor == null ) ? null : constructor.newInstance(); - } catch ( ReflectiveOperationException ex ) + return ( constructor == null ) ? null : constructor.get(); // Waterfall - speed up packet construction + } catch ( Exception ex ) // Waterfall - speed up packet construction { throw new BadPacketException( "Could not construct packet with id " + id, ex ); } } - private void registerPacket(Class packetClass, ProtocolMapping... mappings) + private

void registerPacket(Class

packetClass, java.util.function.Supplier

constructor, ProtocolMapping... mappings) // Waterfall - speed up packet construction { + // Waterfall start - speed up packet construction + /* try { Constructor constructor = packetClass.getDeclaredConstructor(); + */ // Waterfall end int mappingIndex = 0; ProtocolMapping mapping = mappings[mappingIndex]; @@ -479,11 +520,32 @@ public enum Protocol data.packetMap.put( packetClass, mapping.packetID ); data.packetConstructors[mapping.packetID] = constructor; } + // Waterfall start - speed up packet construction + /* } catch ( NoSuchMethodException ex ) { throw new BadPacketException( "No NoArgsConstructor for packet class " + packetClass ); } + */ // Waterfall end } + // Waterfall start - speed up packet construction (backwards compat) + private

void registerPacket(Class

packetClass, ProtocolMapping... mappings) { + java.util.function.Supplier

packetSupplier; + try { + Constructor constructor = packetClass.getDeclaredConstructor(); + packetSupplier = () -> { + try { + return (P) constructor.newInstance(); + } catch (Exception e) { + throw new RuntimeException(e); + } + }; + } catch (ReflectiveOperationException e) { + throw new BadPacketException( "No NoArgsConstructor for packet class " + packetClass ); + } + registerPacket(packetClass, packetSupplier, mappings); + } + // Waterfall end final int getId(Class packet, int version) { -- 2.24.0