瀏覽代碼

Reuse one big buffer per thread and copy the outbound
smaller buffers. Way faster and way cheaper overall.


git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7259 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

PSp..om 14 年之前
父節點
當前提交
9073820361
共有 1 個文件被更改,包括 20 次插入10 次删除
  1. 20 10
      engine/src/networking/com/jme3/network/base/DefaultClient.java

+ 20 - 10
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());
     static Logger log = Logger.getLogger(DefaultClient.class.getName());
     
     
+    private ThreadLocal<ByteBuffer> dataBuffer = new ThreadLocal<ByteBuffer>();
+    
     private int id = -1;
     private int id = -1;
     private boolean isRunning = false;
     private boolean isRunning = false;
     private CountDownLatch connecting = new CountDownLatch(1);
     private CountDownLatch connecting = new CountDownLatch(1);
@@ -197,17 +199,25 @@ public class DefaultClient implements Client
         if( waitForConnected ) {       
         if( waitForConnected ) {       
             // Make sure we aren't still connecting
             // Make sure we aren't still connecting
             waitForConnected();
             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( message.isReliable() || fast == null ) {
             if( reliable == null )
             if( reliable == null )
                 throw new RuntimeException( "No reliable connector configured" );
                 throw new RuntimeException( "No reliable connector configured" );