From 25efdf442b60a21767250917e2d35da26d92372d 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 3a686e60..0dffc8d2 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 @@ -54,6 +54,7 @@ public enum Protocol { TO_SERVER.registerPacket( Handshake.class, + Handshake::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_8, 0x00 ) ); } @@ -65,6 +66,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 ), @@ -75,6 +77,7 @@ 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 ), @@ -84,6 +87,7 @@ public enum Protocol ); 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 ), @@ -92,6 +96,7 @@ public enum Protocol ); 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 ), @@ -104,6 +109,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( BossBar.class, + BossBar::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_9, 0x0C ), map( ProtocolConstants.MINECRAFT_1_15, 0x0D ), map( ProtocolConstants.MINECRAFT_1_16, 0x0C ) @@ -111,17 +117,20 @@ public enum Protocol // 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, Integer.MIN_VALUE) ); TO_CLIENT.registerPacket( EntityRemoveEffect.class, + EntityRemoveEffect::new, // Waterfall - speed up packet construction map(ProtocolConstants.MINECRAFT_1_8, 0x1E), map(ProtocolConstants.MINECRAFT_1_9, Integer.MIN_VALUE) ); // 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 ), @@ -133,6 +142,7 @@ 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 ), @@ -142,6 +152,7 @@ public enum Protocol ); 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 ), @@ -152,6 +163,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 ), @@ -162,6 +174,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 ), @@ -172,6 +185,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 ), @@ -182,6 +196,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 ), @@ -192,6 +207,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 ), @@ -202,6 +218,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 ), @@ -212,6 +229,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 ), @@ -224,6 +242,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 ), @@ -234,6 +253,7 @@ public enum Protocol ); TO_CLIENT.registerPacket( Commands.class, + Commands::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_13, 0x11 ), map( ProtocolConstants.MINECRAFT_1_15, 0x12 ), map( ProtocolConstants.MINECRAFT_1_16, 0x11 ), @@ -241,12 +261,14 @@ public enum Protocol ); TO_CLIENT.registerPacket( GameState.class, + GameState::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_15, 0x1F ), map( ProtocolConstants.MINECRAFT_1_16, 0x1E ), map( ProtocolConstants.MINECRAFT_1_16_2, 0x1D ) ); TO_CLIENT.registerPacket( ViewDistance.class, + ViewDistance::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_14, 0x41 ), map( ProtocolConstants.MINECRAFT_1_15, 0x42 ), map( ProtocolConstants.MINECRAFT_1_16, 0x41 ) @@ -254,6 +276,7 @@ public enum Protocol 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 ), @@ -264,6 +287,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 ), @@ -272,6 +296,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 ), @@ -281,6 +306,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 ), @@ -289,6 +315,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 ), @@ -305,19 +332,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 ) ); } @@ -329,35 +360,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 ) ); } @@ -408,7 +447,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 @@ -476,21 +515,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]; @@ -521,11 +563,32 @@ public enum Protocol data.packetConstructors[mapping.packetID] = constructor; } // Waterfall } + // 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.31.1