[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