[Orxonox-commit 588] r3120 - in branches/netp4/src/network: . packet

scheusso at orxonox.net scheusso at orxonox.net
Mon Jun 8 16:03:45 CEST 2009


Author: scheusso
Date: 2009-06-08 16:03:44 +0200 (Mon, 08 Jun 2009)
New Revision: 3120

Modified:
   branches/netp4/src/network/GamestateManager.cc
   branches/netp4/src/network/packet/Acknowledgement.cc
   branches/netp4/src/network/packet/Gamestate.cc
   branches/netp4/src/network/packet/Gamestate.h
Log:
optimised diff function (unrolled to 8byte xor)


Modified: branches/netp4/src/network/GamestateManager.cc
===================================================================
--- branches/netp4/src/network/GamestateManager.cc	2009-06-07 11:54:02 UTC (rev 3119)
+++ branches/netp4/src/network/GamestateManager.cc	2009-06-08 14:03:44 UTC (rev 3120)
@@ -132,7 +132,10 @@
     if(client){
 //       COUT(3) << "diffing" << std::endl;
 //       packet::Gamestate* gs1  = gs;
-      gs = gs->diff(client);
+      packet::Gamestate *diffed = gs->diff(client);
+      //packet::Gamestate *gs2 = diffed->undiff(gs);
+//       assert(*gs == *gs2);
+      gs = diffed;
 //       packet::Gamestate* gs2 = gs->undiff(client);
 //       gs = new packet::Gamestate(*gs);
 //       assert(*gs1==*gs2);

Modified: branches/netp4/src/network/packet/Acknowledgement.cc
===================================================================
--- branches/netp4/src/network/packet/Acknowledgement.cc	2009-06-07 11:54:02 UTC (rev 3119)
+++ branches/netp4/src/network/packet/Acknowledgement.cc	2009-06-08 14:03:44 UTC (rev 3120)
@@ -63,7 +63,7 @@
 }
 
 bool Acknowledgement::process(){
-COUT(6) << "processing ACK with ID: " << getAckID() << endl;
+  COUT(5) << "processing ACK with ID: " << getAckID() << endl;
   bool b = GamestateHandler::ackGamestate(getAckID(), clientID_);
   delete this;
   return b;

Modified: branches/netp4/src/network/packet/Gamestate.cc
===================================================================
--- branches/netp4/src/network/packet/Gamestate.cc	2009-06-07 11:54:02 UTC (rev 3119)
+++ branches/netp4/src/network/packet/Gamestate.cc	2009-06-08 14:03:44 UTC (rev 3120)
@@ -137,6 +137,7 @@
   //start write gamestate header
   header_->setDataSize( currentsize );
   header_->setID( id );
+  header_->setBaseID( GAMESTATEID_INITIAL );
   header_->setDiffed( false );
   header_->setComplete( true );
   header_->setCompressed( false );
@@ -207,7 +208,6 @@
     }
   }
 #endif
-
   return true;
 }
 
@@ -320,7 +320,7 @@
   return true;
 }
 
-Gamestate *Gamestate::diff(Gamestate *base)
+/*Gamestate *Gamestate::diff(Gamestate *base)
 {
   assert(data_);
   assert(!header_->isCompressed());
@@ -355,8 +355,73 @@
   g->flags_=flags_;
   g->packetDirection_ = packetDirection_;
   return g;
+}*/
+
+Gamestate *Gamestate::diff(Gamestate *base)
+{
+  assert(this && base); assert(data_ && base->data_);
+  assert(!header_->isCompressed() && !base->header_->isCompressed());
+  assert(!header_->isDiffed());
+  
+  uint8_t *basep = GAMESTATE_START(base->data_);
+  uint8_t *gs = GAMESTATE_START(this->data_);
+  uint32_t dest_length = header_->getDataSize();
+  
+  if(dest_length==0)
+    return NULL;
+  
+  uint8_t *ndata = new uint8_t[dest_length*sizeof(uint8_t)+GamestateHeader::getSize()];
+  uint8_t *dest = GAMESTATE_START(ndata);
+  
+  rawDiff( dest, gs, basep, header_->getDataSize(), base->header_->getDataSize() );
+#ifndef NDEBUG
+  uint8_t *dest2 = new uint8_t[dest_length];
+  rawDiff( dest2, dest, basep, header_->getDataSize(), base->header_->getDataSize() );
+  assert( memcmp( dest2, gs, dest_length) == 0 );
+#endif
+
+  Gamestate *g = new Gamestate(ndata, getClientID());
+  assert(g->header_);
+  *(g->header_) = *header_;
+  g->header_->setDiffed( true );
+  g->header_->setBaseID( base->getID() );
+  g->flags_=flags_;
+  g->packetDirection_ = packetDirection_;
+  assert(g->isDiffed());
+  assert(!g->isCompressed());
+  return g;
 }
 
+Gamestate *Gamestate::undiff(Gamestate *base)
+{
+  assert(this && base); assert(data_ && base->data_);
+  assert(!header_->isCompressed() && !base->header_->isCompressed());
+  assert(header_->isDiffed());
+  
+  uint8_t *basep = GAMESTATE_START(base->data_);
+  uint8_t *gs = GAMESTATE_START(this->data_);
+  uint32_t dest_length = header_->getDataSize();
+  
+  if(dest_length==0)
+    return NULL;
+  
+  uint8_t *ndata = new uint8_t[dest_length*sizeof(uint8_t)+GamestateHeader::getSize()];
+  uint8_t *dest = ndata + GamestateHeader::getSize();
+  
+  rawDiff( dest, gs, basep, header_->getDataSize(), base->header_->getDataSize() );
+  
+  Gamestate *g = new Gamestate(ndata, getClientID());
+  assert(g->header_);
+  *(g->header_) = *header_;
+  g->header_->setDiffed( false );
+  g->flags_=flags_;
+  g->packetDirection_ = packetDirection_;
+  assert(!g->isDiffed());
+  assert(!g->isCompressed());
+  return g;
+}
+
+
 // Gamestate *Gamestate::diff(Gamestate *base)
 // {
 //   assert(data_);
@@ -409,6 +474,33 @@
 //   return g;
 // }
 
+
+void Gamestate::rawDiff( uint8_t* newdata, uint8_t* data, uint8_t* basedata, uint32_t datalength, uint32_t baselength)
+{
+  uint64_t* gd = (uint64_t*)data;
+  uint64_t* bd = (uint64_t*)basedata;
+  uint64_t* nd = (uint64_t*)newdata;
+  
+  unsigned int i;
+  for( i=0; i<datalength/8; i++ )
+  {
+    if( i<baselength/8 )
+      *(nd+i) = *(gd+i) ^ *(bd+i);  // xor the data
+    else
+      *(nd+i) = *(gd+i); // just copy over the data
+  }
+  unsigned int j;
+  // now process the rest (when datalength isn't a multiple of 4)
+  for( j = 8*(datalength/8); j<datalength; j++ )
+  {
+    if( j<baselength )
+      *(newdata+j) = *(data+j) ^ *(basedata+j); // xor
+    else
+      *(newdata+j) = *(data+j); // just copy
+  }
+  assert(j==datalength);
+}
+
 Gamestate* Gamestate::doSelection(unsigned int clientID, unsigned int targetSize){
   assert(data_);
   std::list<obj>::iterator it;
@@ -478,7 +570,7 @@
 }
 
 
-Gamestate *Gamestate::undiff(Gamestate *base)
+/*Gamestate *Gamestate::undiff(Gamestate *base)
 {
   assert(this && base);assert(data_);
   assert(header_->isDiffed());
@@ -514,9 +606,8 @@
   assert(!g->isDiffed());
   assert(!g->isCompressed());
   return g;
-}
+}*/
 
-
 uint32_t Gamestate::calcGamestateSize(int32_t id, uint8_t mode)
 {
   uint32_t size=0;

Modified: branches/netp4/src/network/packet/Gamestate.h
===================================================================
--- branches/netp4/src/network/packet/Gamestate.h	2009-06-07 11:54:02 UTC (rev 3119)
+++ branches/netp4/src/network/packet/Gamestate.h	2009-06-08 14:03:44 UTC (rev 3120)
@@ -123,6 +123,7 @@
 
     // Packet functions
   private:
+    void rawDiff( uint8_t* newdata, uint8_t* data, uint8_t* basedata, uint32_t datalength, uint32_t baselength);
     virtual uint32_t getSize() const;
     virtual inline bool process();
 




More information about the Orxonox-commit mailing list