[Orxonox-commit 2452] r7159 - in code/branches/presentation3/src/libraries/network: packet synchronisable

scheusso at orxonox.net scheusso at orxonox.net
Wed Jul 21 16:27:51 CEST 2010


Author: scheusso
Date: 2010-07-21 16:27:51 +0200 (Wed, 21 Jul 2010)
New Revision: 7159

Modified:
   code/branches/presentation3/src/libraries/network/packet/Gamestate.cc
   code/branches/presentation3/src/libraries/network/synchronisable/Synchronisable.h
Log:
fixed a bug in gamestate diffing which slowed down the diff process


Modified: code/branches/presentation3/src/libraries/network/packet/Gamestate.cc
===================================================================
--- code/branches/presentation3/src/libraries/network/packet/Gamestate.cc	2010-07-21 12:43:10 UTC (rev 7158)
+++ code/branches/presentation3/src/libraries/network/packet/Gamestate.cc	2010-07-21 14:27:51 UTC (rev 7159)
@@ -404,15 +404,36 @@
     while ( temp < baseData+baseLength )
     {
       SynchronisableHeader htemp(temp);
+      assert( htemp.getDataSize()!=0 );
       if ( htemp.getObjectID() == objectID )
       {
         assert( h.getClassID() == htemp.getClassID() );
         goto DODIFF;
       }
+//       {
+//         SynchronisableHeader htemp2(temp+htemp.getDataSize()+SynchronisableHeader::getSize());
+//         if( temp+htemp.getDataSize()+SynchronisableHeader::getSize() < baseData+baseLength )
+//         {
+//           assert(htemp2.getClassID()<500);
+//           assert(htemp2.getDataSize()!=0 && htemp2.getDataSize()<1000);
+//           assert(htemp2.isDiffed()==false);
+//         }
+//       }
       temp += htemp.getDataSize()+SynchronisableHeader::getSize();
+        
     }
     // If not found start looking at the beginning
+    assert( temp==baseData+baseLength );
     temp = baseData;
+//     {
+//       SynchronisableHeader htemp2(temp);
+//       if( temp < baseData+baseLength )
+//       {
+//         assert(htemp2.getClassID()<500);
+//         assert(htemp2.getDataSize()!=0 && htemp2.getDataSize()<1000);
+//         assert(htemp2.isDiffed()==false);
+//       }
+//     }
     while ( temp < baseData+baseOffset )
     {
       SynchronisableHeader htemp(temp);
@@ -421,6 +442,15 @@
         assert( h.getClassID() == htemp.getClassID() );
         goto DODIFF;
       }
+//       {
+//         SynchronisableHeader htemp2(temp+htemp.getDataSize()+SynchronisableHeader::getSize());
+//         if( temp+htemp.getDataSize()+SynchronisableHeader::getSize() < baseData+baseLength )
+//         {
+//           assert(htemp2.getClassID()<500);
+//           assert(htemp2.getDataSize()!=0 && htemp2.getDataSize()<1000);
+//           assert(htemp2.isDiffed()==false);
+//         }
+//       }
       temp += htemp.getDataSize()+SynchronisableHeader::getSize();
     }
     // Object is new, thus never transmitted -> just copy over
@@ -429,6 +459,7 @@
 
 DODIFF:
     {
+//       COUT(4) << "dodiff" << endl;
 //       if(baseOffset==0)
 //       {
 //         assert(origOffset==0);
@@ -437,12 +468,16 @@
       // Check whether the whole object stayed the same
       if( memcmp( origData+origOffset+objectOffset, temp+objectOffset, h.getDataSize()) == 0 )
       {
+//         COUT(4) << "skip object" << Synchronisable::getSynchronisable(h.getObjectID())->getIdentifier()->getName() << endl;
         origOffset += objectOffset+ h.getDataSize(); // skip the whole object
         baseOffset = temp + h.getDataSize()+SynchronisableHeader::getSize() - baseData;
         sizes += Synchronisable::getSynchronisable(h.getObjectID())->getNrOfVariables();
       }
       else
       {
+//         if( Synchronisable::getSynchronisable(h.getObjectID())->getIdentifier()->getName() == "Bot" )
+//           COUT(0) << "blub" << endl;
+//         COUT(4) << "object diff: " << Synchronisable::getSynchronisable(h.getObjectID())->getIdentifier()->getName() << endl;
 //         COUT(4) << "diff " << h.getObjectID() << ":";
         // Now start to diff the Object
         SynchronisableHeaderLight h2(dest);
@@ -461,7 +496,7 @@
           {
             if ( memcmp(origData+origOffset+objectOffset, temp+objectOffset, varSize) != 0 )
             {
-//               COUT(4) << " c" << varSize;
+//               COUT(4) << "copy variable" << endl;
               *(VariableID*)(dest+newObjectOffset) = variableID; // copy over the variableID
               newObjectOffset += sizeof(VariableID);
               memcpy( dest+newObjectOffset, origData+origOffset+objectOffset, varSize );
@@ -470,14 +505,17 @@
             }
             else
             {
-//               COUT(4) << " s" << varSize;
+//               COUT(4) << "skip variable" << endl;
               objectOffset += varSize;
             }
           }
+//           else
+//             COUT(4) << "varsize 0" << endl;
 
           ++variableID;
           ++sizes;
         }
+        
         if( Synchronisable::getSynchronisable(h.getObjectID())->getNrOfVariables() != variableID )
           sizes += Synchronisable::getSynchronisable(h.getObjectID())->getNrOfVariables() - variableID;
 //         COUT(4) << endl;
@@ -485,7 +523,20 @@
         h2.setDataSize(newObjectOffset-SynchronisableHeaderLight::getSize());
         assert(objectOffset == h.getDataSize()+SynchronisableHeader::getSize());
         origOffset += objectOffset;
-        baseOffset += temp + h.getDataSize()+SynchronisableHeader::getSize() - baseData;
+//         baseOffset += temp + h.getDataSize()+SynchronisableHeader::getSize() - baseData;
+        //baseOffset += objectOffset;
+//         SynchronisableHeader htemp(temp);
+//         baseOffset += SynchronisableHeader::getSize() + htemp.getDataSize();
+//         {
+//           SynchronisableHeader htemp2( baseData+(temp-baseData+objectOffset) );
+//           if( baseData+(temp-baseData+objectOffset) < baseData+baseLength )
+//           {
+//             assert(htemp2.getClassID()<500);
+//             assert(htemp2.getDataSize()!=0 && htemp2.getDataSize()<1000);
+//             assert(htemp2.isDiffed()==false);
+//           }
+//         }
+        baseOffset = temp-baseData + objectOffset;
         dest += newObjectOffset;
       }
 
@@ -494,6 +545,7 @@
 
 DOCOPY:
     {
+//       COUT(4) << "docopy" << endl;
       // Just copy over the whole Object
       memcpy( dest, origData+origOffset, h.getDataSize()+SynchronisableHeader::getSize() );
       dest += h.getDataSize()+SynchronisableHeader::getSize();

Modified: code/branches/presentation3/src/libraries/network/synchronisable/Synchronisable.h
===================================================================
--- code/branches/presentation3/src/libraries/network/synchronisable/Synchronisable.h	2010-07-21 12:43:10 UTC (rev 7158)
+++ code/branches/presentation3/src/libraries/network/synchronisable/Synchronisable.h	2010-07-21 14:27:51 UTC (rev 7159)
@@ -88,9 +88,9 @@
       inline static uint32_t getSize()
         { return 14; }
       inline uint16_t getDataSize() const
-        { return (*(uint16_t*)data_) & 0x7FFF; } //only use the first 31 bits
+        { return (*(uint16_t*)data_) & 0x7FFF; } //only use the first 15 bits
       inline void setDataSize(uint16_t size)
-        { *(uint16_t*)(data_) = (size & 0x7FFFFFFF) | (*(uint16_t*)(data_) & 0x8000 ); }
+        { *(uint16_t*)(data_) = (size & 0x7FFF) | (*(uint16_t*)(data_) & 0x8000 ); }
       inline bool isDiffed() const
         { return ( (*(uint16_t*)data_) & 0x8000 ) == 0x8000; }
       inline void setDiffed( bool b)




More information about the Orxonox-commit mailing list