diff --git a/engine/src/networking/com/jme3/network/base/DefaultClient.java b/engine/src/networking/com/jme3/network/base/DefaultClient.java index 4c515f77f..62333b66f 100644 --- a/engine/src/networking/com/jme3/network/base/DefaultClient.java +++ b/engine/src/networking/com/jme3/network/base/DefaultClient.java @@ -57,6 +57,8 @@ public class DefaultClient implements Client { static Logger log = Logger.getLogger(DefaultClient.class.getName()); + private ThreadLocal dataBuffer = new ThreadLocal(); + private int id = -1; private boolean isRunning = false; private CountDownLatch connecting = new CountDownLatch(1); @@ -197,17 +199,25 @@ public class DefaultClient implements Client if( waitForConnected ) { // Make sure we aren't still connecting waitForConnected(); - } + } + + ByteBuffer buffer = dataBuffer.get(); + if( buffer == null ) { + buffer = ByteBuffer.allocate( 65536 + 2 ); + dataBuffer.set(buffer); + } + buffer.clear(); + + // Convert the message to bytes + buffer = MessageProtocol.messageToBuffer(message, buffer); + + // Since we share the buffer between invocations, we will need to + // copy this message's part out of it. This is because we actually + // do the send on a background thread. + byte[] temp = new byte[buffer.remaining()]; + System.arraycopy(buffer.array(), buffer.position(), temp, 0, buffer.remaining()); + buffer = ByteBuffer.wrap(temp); - // For now just send direclty. We allocate our - // own buffer each time because this method might - // be called from multiple threads. If writing - // is queued into its own thread then that could - // be shared. - // Writing is now done on a background thread. - // If we ever share a ByteBuffer then it will need to be - // copied before handing off. - ByteBuffer buffer = MessageProtocol.messageToBuffer(message, null); if( message.isReliable() || fast == null ) { if( reliable == null ) throw new RuntimeException( "No reliable connector configured" );