Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Sep 12, 2008, 5:36:57 PM (16 years ago)
Author:
scheusso
Message:

we have a new gamestate concept now: dont transmit synchronisable header of objects, that dont get updated that tick. transmit objectids of deleted objects to delete them on the client too

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/network/src/network/packet/Gamestate.cc

    r1767 r1775  
    4646#define HEADER GAMESTATE_HEADER(data_)
    4747
     48 
    4849Gamestate::Gamestate()
    4950{
     
    8081  orxonox::ObjectList<Synchronisable>::iterator it;
    8182  for(it = orxonox::ObjectList<Synchronisable>::begin(); it; ++it){
    82     tempsize=it->getSize2(id, mode);
     83    tempsize=it->getSize(id, mode);
    8384
    8485    if(currentsize+tempsize > size){
     
    8889      int addsize=tempsize;
    8990      while(++temp)
    90         addsize+=temp->getSize2(id, mode);
     91        addsize+=temp->getSize(id, mode);
    9192      data_ = (unsigned char *)realloc(data_, sizeof(GamestateHeader) + currentsize + addsize);
    9293      if(!data_)
     
    105106  HEADER->packetType = ENUM::Gamestate;
    106107  assert( *(ENUM::Type *)(data_) == ENUM::Gamestate);
    107   HEADER->normsize = currentsize;
     108  HEADER->datasize = currentsize;
    108109  HEADER->id = id;
    109110  HEADER->diffed = false;
     
    125126  unsigned char *mem=data_+sizeof(GamestateHeader);
    126127    // get the start of the Synchronisable list
    127   orxonox::ObjectList<Synchronisable>::iterator it=orxonox::ObjectList<Synchronisable>::begin();
    128 
    129   while(mem < data_+sizeof(GamestateHeader)+HEADER->normsize){
    130       // extract synchronisable header
     128  //orxonox::ObjectList<Synchronisable>::iterator it=orxonox::ObjectList<Synchronisable>::begin();
     129  Synchronisable *s;
     130
     131  // update the data of the objects we received
     132  while(mem < data_+sizeof(GamestateHeader)+HEADER->datasize){
    131133    size = *(unsigned int *)mem;
    132134    objectID = *(unsigned int*)(mem+sizeof(unsigned int));
    133135    classID = *(unsigned int*)(mem+2*sizeof(unsigned int));
    134136
    135     if(!it || it->objectID!=objectID || it->classID!=classID){
    136         // bad luck ;)
    137         // delete the synchronisable (obviously seems to be deleted on the server)
    138       while(it && it->objectID!=objectID)
    139         removeObject(it);
    140 
    141       if(!it){
    142         //fabricate the new synchronisable
    143         if(!Synchronisable::fabricate(mem, mode))
    144           return false;
    145         it=orxonox::ObjectList<Synchronisable>::end();
    146       }else{
    147         if(! it->updateData(mem, mode))
    148         {
    149           COUT(1) << "We couldn't update objectID: " \
    150             << objectID << "; classID: " << classID << std::endl;
    151         }
    152       }
    153     } else
     137    s = Synchronisable::getSynchronisable( objectID );
     138    if(!s)
    154139    {
    155         // we have our object
    156       if(! it->updateData(mem, mode))
    157       {
    158         COUT(1) << "We couldn't update objectID: " \
    159             << objectID << "; classID: " << classID << std::endl;
    160       }
     140      s = Synchronisable::fabricate(mem, mode);
     141      if(!s)
     142        return false;
    161143    }
    162     ++it;
    163   }
    164 
    165   return true;
    166 }
     144    else
     145    {
     146      if(!s->updateData(mem, mode))
     147        return false;
     148    }
     149  }
     150
     151  return true;
     152}
     153
     154
    167155
    168156int Gamestate::getID(){
     
    177165  else
    178166  {
    179     return HEADER->normsize+sizeof(GamestateHeader);
     167    return HEADER->datasize+sizeof(GamestateHeader);
    180168  }
    181169}
     
    186174  assert(!isCompressed());
    187175  assert(!gs.isCompressed());
    188   while(d1<data_+HEADER->normsize)
     176  while(d1<data_+HEADER->datasize)
    189177  {
    190178    if(*d1!=*d2)
     
    205193  assert(HEADER);
    206194  assert(!HEADER->compressed);
    207   uLongf buffer = (uLongf)(((HEADER->normsize + 12)*1.01)+1);
     195  uLongf buffer = (uLongf)(((HEADER->datasize + 12)*1.01)+1);
    208196  if(buffer==0)
    209197    return false;
     
    214202  unsigned char *source = GAMESTATE_START(data_);
    215203  int retval;
    216   retval = compress( dest, &buffer, source, (uLong)(HEADER->normsize) );
     204  retval = compress( dest, &buffer, source, (uLong)(HEADER->datasize) );
    217205  switch ( retval ) {
    218206    case Z_OK: COUT(5) << "G.St.Man: compress: successfully compressed" << std::endl; break;
     
    223211#ifndef NDEBUG
    224212  //decompress and compare the start and the decompressed data
    225   unsigned char *rdata = new unsigned char[HEADER->normsize+sizeof(GamestateHeader)];
     213  unsigned char *rdata = new unsigned char[HEADER->datasize+sizeof(GamestateHeader)];
    226214  unsigned char *d2 = GAMESTATE_START(rdata);
    227   uLongf length2 = HEADER->normsize;
     215  uLongf length2 = HEADER->datasize;
    228216  uncompress(d2, &length2, dest, buffer);
    229   for(unsigned int i=0; i<HEADER->normsize; i++){
     217  for(unsigned int i=0; i<HEADER->datasize; i++){
    230218    assert(*(source+i)==*(d2+i));
    231219  }
     
    235223  //copy and modify header
    236224#ifndef NDEBUG
    237   HEADER->crc32 = calcCRC(data_+sizeof(GamestateHeader), HEADER->normsize);
     225  HEADER->crc32 = calcCRC(data_+sizeof(GamestateHeader), HEADER->datasize);
    238226#endif
    239227  *GAMESTATE_HEADER(ndata) = *HEADER;
     
    245233  HEADER->compressed = true;
    246234  assert(HEADER->compressed);
    247   COUT(3) << "gamestate compress normsize: " << HEADER->normsize << " compsize: " << HEADER->compsize << std::endl;
     235  COUT(3) << "gamestate compress datasize: " << HEADER->datasize << " compsize: " << HEADER->compsize << std::endl;
    248236  return true;
    249237}
     
    252240  assert(HEADER);
    253241  assert(HEADER->compressed);
    254   COUT(3) << "GameStateClient: uncompressing gamestate. id: " << HEADER->id << ", baseid: " << HEADER->base_id << ", normsize: " << HEADER->normsize << ", compsize: " << HEADER->compsize << std::endl;
    255   unsigned int normsize = HEADER->normsize;
     242  COUT(3) << "GameStateClient: uncompressing gamestate. id: " << HEADER->id << ", baseid: " << HEADER->base_id << ", datasize: " << HEADER->datasize << ", compsize: " << HEADER->compsize << std::endl;
     243  unsigned int datasize = HEADER->datasize;
    256244  unsigned int compsize = HEADER->compsize;
    257245  unsigned int bufsize;
    258   assert(compsize<=normsize);
    259   bufsize = normsize;
     246  assert(compsize<=datasize);
     247  bufsize = datasize;
    260248  assert(bufsize!=0);
    261249  unsigned char *ndata = new unsigned char[bufsize + sizeof(GamestateHeader)];
     
    272260  }
    273261#ifndef NDEBUG
    274   assert(HEADER->crc32==calcCRC(ndata+sizeof(GamestateHeader), HEADER->normsize));
     262  assert(HEADER->crc32==calcCRC(ndata+sizeof(GamestateHeader), HEADER->datasize));
    275263#endif
    276264
     
    282270  data_ = ndata;
    283271  HEADER->compressed = false;
    284   assert(HEADER->normsize==normsize);
     272  assert(HEADER->datasize==datasize);
    285273  assert(HEADER->compsize==compsize);
    286274  return true;
     
    296284  unsigned int of=0; // pointers offset
    297285  unsigned int dest_length=0;
    298   dest_length=HEADER->normsize;
     286  dest_length=HEADER->datasize;
    299287  if(dest_length==0)
    300288    return NULL;
    301289  unsigned char *ndata = new unsigned char[dest_length*sizeof(unsigned char)+sizeof(GamestateHeader)];
    302290  unsigned char *dest = ndata + sizeof(GamestateHeader);
    303   while(of < GAMESTATE_HEADER(base->data_)->normsize && of < HEADER->normsize){
     291  while(of < GAMESTATE_HEADER(base->data_)->datasize && of < HEADER->datasize){
    304292    *(dest+of)=*(basep+of)^*(gs+of); // do the xor
    305293    ++of;
    306294  }
    307   if(GAMESTATE_HEADER(base->data_)->normsize!=HEADER->normsize){
     295  if(GAMESTATE_HEADER(base->data_)->datasize!=HEADER->datasize){
    308296    unsigned char n=0;
    309     if(GAMESTATE_HEADER(base->data_)->normsize < HEADER->normsize){
     297    if(GAMESTATE_HEADER(base->data_)->datasize < HEADER->datasize){
    310298      while(of<dest_length){
    311299        *(dest+of)=n^*(gs+of);
     
    334322  unsigned int of=0; // pointers offset
    335323  unsigned int dest_length=0;
    336   dest_length=HEADER->normsize;
     324  dest_length=HEADER->datasize;
    337325  if(dest_length==0)
    338326    return NULL;
    339327  unsigned char *ndata = new unsigned char[dest_length*sizeof(unsigned char)+sizeof(GamestateHeader)];
    340328  unsigned char *dest = ndata + sizeof(GamestateHeader);
    341   while(of < GAMESTATE_HEADER(base->data_)->normsize && of < HEADER->normsize){
     329  while(of < GAMESTATE_HEADER(base->data_)->datasize && of < HEADER->datasize){
    342330    *(dest+of)=*(basep+of)^*(gs+of); // do the xor
    343331    ++of;
    344332  }
    345   if(GAMESTATE_HEADER(base->data_)->normsize!=HEADER->normsize){
     333  if(GAMESTATE_HEADER(base->data_)->datasize!=HEADER->datasize){
    346334    unsigned char n=0;
    347     if(GAMESTATE_HEADER(base->data_)->normsize < HEADER->normsize){
     335    if(GAMESTATE_HEADER(base->data_)->datasize < HEADER->datasize){
    348336      while(of < dest_length){
    349337        *(dest+of)=n^*(gs+of);
     
    370358    // get total size of gamestate
    371359  for(it = orxonox::ObjectList<Synchronisable>::begin(); it; ++it)
    372     size+=it->getSize2(id, mode); // size of the actual data of the synchronisable
     360    size+=it->getSize(id, mode); // size of the actual data of the synchronisable
    373361//  size+=sizeof(GamestateHeader);
    374362  return size;
Note: See TracChangeset for help on using the changeset viewer.