From 7f97b50764317451f071dffa20673c408a6dfe6c 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 043e8562..aa1515f4 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 ), @@ -73,6 +75,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 ), @@ -80,6 +83,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 ), @@ -87,6 +91,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 ), @@ -97,12 +102,14 @@ 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 ) ); // 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), @@ -114,6 +121,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), @@ -125,6 +133,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 ), @@ -134,6 +143,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 ), @@ -141,6 +151,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 ), @@ -151,6 +162,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 ), @@ -161,6 +173,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 ), @@ -171,6 +184,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 ), @@ -181,6 +195,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 ), @@ -189,6 +204,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 ), @@ -197,6 +213,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 ), @@ -206,6 +223,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 ), @@ -217,6 +235,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 ), @@ -225,21 +244,25 @@ 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 ) ); TO_CLIENT.registerPacket( GameState.class, + GameState::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_15, 0x1F ) ); TO_CLIENT.registerPacket( ViewDistance.class, + ViewDistance::new, // Waterfall - speed up packet construction map( ProtocolConstants.MINECRAFT_1_14, 0x41 ), map( ProtocolConstants.MINECRAFT_1_15, 0x42 ) ); 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 ), @@ -249,6 +272,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 ), @@ -257,6 +281,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 ), @@ -266,6 +291,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 ), @@ -274,6 +300,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 ), @@ -290,19 +317,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 ) ); } @@ -314,35 +345,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 ) ); } @@ -393,7 +432,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 @@ -461,21 +500,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]; @@ -504,11 +546,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.26.1