From dc148013708fe031509a9aa1592078bd0b59731f 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 66c925d0..d372933d 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,6 +117,7 @@ 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, 0x4C), map(ProtocolConstants.MINECRAFT_1_9_4, 0x4B), @@ -123,6 +130,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), @@ -136,6 +144,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 ), @@ -147,6 +156,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 ), @@ -156,6 +166,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 ), @@ -166,6 +177,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 ), @@ -176,6 +188,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 ), @@ -186,6 +199,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 ), @@ -196,6 +210,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 ), @@ -206,6 +221,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 ), @@ -216,6 +232,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 ), @@ -226,6 +243,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 ), @@ -238,6 +256,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 ), @@ -248,6 +267,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 ), @@ -255,12 +275,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 ) @@ -268,6 +290,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 ), @@ -278,6 +301,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 ), @@ -286,6 +310,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 ), @@ -295,6 +320,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 ), @@ -303,6 +329,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 ), @@ -319,19 +346,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 ) ); } @@ -343,35 +374,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 ) ); } @@ -422,7 +461,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 @@ -490,21 +529,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]; @@ -533,11 +575,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