[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