青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

3d Game Walkman

3d圖形渲染,網絡引擎 — tonykee's Blog
隨筆 - 45, 文章 - 0, 評論 - 309, 引用 - 0
數據加載中……

今天做了一個Struct結構,作為游戲里面的包容器來使用,可以一次發送多個邏輯結構信息了,爽啊!!!

游戲里面的數據,最重要的就是如何組織,常見的包結構就是type+len+data這樣的結構 

//所有包的基類型
struct BasePack
 {
  unsigned short type;  //類型
  unsigned short len;   //長度
  BasePack();
  unsigned short size();
 };


 //////////////////////////////////////////////////////////////////////////
 //比如這個是登錄包結構
 struct LoginPack :public BasePack
 {
  char username[15];
  char password[10];
  LoginPack();
  unsigned short size();
 };

//..還有很多類型的包結構,自己去擴展

//下面這個包結構就很特別了:
這個struct 結構能保存變長的子結構體,也就是結構體的容器,如果一次要發送大量查詢的數據,可以用這個容器來裝載。結構大致如下:
//////////////////////////////////////////////////////////////////////////
 //集合包,這是個很特殊的包,里面的數據是變長的(buffer 將作為子包的首指針)
 //當然也有個上限,只不過和StringPack一樣,每次發送的數據量不固定,并不一定是包體的長度,
 //使用這個包的注意事項:1.如果用tcp,總長不要超過4096, 如果用udp總長不要超過1024(安全指數)
 //                      2.一般一個包不會共享給多個線程來處理,而且都是臨時拼發,并未考慮線程安全
 struct CollectionPack:public BasePack
 {
  unsigned short mSubPackCount;   //子包的數量

  char buffer[4096];           //最大限度的包長度,做緩沖

  CollectionPack();

  //清除CollectionPack里面的內容
  void clear();

  //得到子包的數量
  unsigned short getSubpackCount();

  //添加子包,添加是否成功,集合包的大小,默認不超過MTU的大小,當然如果是TCP傳輸,則沒有這個限制,最大可以是4096
  bool   append(BasePack &pack,  unsigned short  maxsize=1500);

  //本集合包的總長度
  unsigned short size();

  //重載數組運算符,這樣就可以數組迭代的方式訪問子包了,不過用索引迭代沒有next迭代的效率高
  BasePack *operator[](int idx);

  //p迭代的指針,返回當前取出來的包的指針使用方法如下:
  //   BasePack *p = 0;
  //while(collection.next(&p))
  //{
  //  p就是當前你找到的包了
  //}
  BasePack * next(BasePack ** p);
 };


CollectionPack::CollectionPack()
{
 memset(buffer,0, 4096);
 type = COLLECTION_PACK;
 mSubPackCount = 0;
}


//清除CollectionPack里面的內容
void CollectionPack::clear()
{
 mSubPackCount = 0;
 memset(buffer,0, 4096);
}

//得到子包的數量
unsigned short CollectionPack::getSubpackCount()
{
 return mSubPackCount;
}

 

//添加子包,添加是否成功
bool   CollectionPack::append(BasePack &pack, unsigned short maxsize)
{
 unsigned int currentlen = size(); //當前整個包的長度
 unsigned int psize = pack.size(); //即將要加入的包的長度

 if(psize + currentlen > maxsize || psize + currentlen > SESSION_BUFFER_LONGTH)
 {
  return false; //不能夠再裝了
 }

 int len  = size() - 6;

 memcpy(buffer + len, &pack,  pack.size());

 //StringPack *p = (StringPack *) (buffer + len);
 mSubPackCount ++;
 return true;
}


//本集合包的總長度
unsigned short CollectionPack::size()
{
 len = 0;
 for(unsigned short i = 0; i < mSubPackCount; i ++)
 {
  BasePack * p = (BasePack *) (buffer + len);
  len += p->size();
 }
 len += 6;     //(type len  SubPackNum 共6個字節)
 return len;
}

 

//重載數組運算符,這樣就可以數組迭代的方式訪問子包了,不過用索引迭代沒有next迭代的效率高
BasePack * CollectionPack::operator[](int idx)
{
 if(idx < 0 || idx >=mSubPackCount)
 {
  return 0; //下標越界
 }

 int ln = 0;
 for(unsigned short i = 0; i < mSubPackCount; i ++)
 {
  BasePack * p = (BasePack *) (buffer + ln);

  if(idx == i)
   return p;
  else
   ln += p->size();
 }

 return 0;
}

 


//p迭代的指針,返回當前取出來的包的指針使用方法如下:
//   BasePack *p = 0;
//while(collection.next(&p))
//{
//  p就是當前你找到的包了
//}
BasePack *  CollectionPack::next(BasePack ** p)
{
 char *cur = 0;

 if((*p)==0)
  cur = buffer;
 else
  cur = (char *)(*p);

 //指針后移,定位到下一個包的位置
 (*p)=(BasePack *)(cur + ((BasePack *)cur)->size());

 if((*p)->type == 0)
  return 0; //沒有類型為0類型的包,如果為0,顯然是到末尾了
 else
  return (*p);
}


有了以上這個容器,要把一些小包組合起來一起發送就非常方便了,但是組合的時候,還是要考慮不能超出上限范圍的

不過在真實的游戲服務器里面,包不一定是采用結構體的方式來發送的,有的是把對象串行化成為字節流的方式來發送。
我覺得這樣比較麻煩,要encoding decoding,效率調試都不方便,直接法結構體,高效,簡單,可就是不太安全。

posted on 2008-01-24 00:21 李侃 閱讀(2071) 評論(2)  編輯 收藏 引用 所屬分類: 網絡模塊

評論

# re: 今天做了一個Struct結構,作為游戲里面的包容器來使用,可以一次發送多個邏輯結構信息了,爽啊!!!  回復  更多評論   

直接序列化數據嘛,干嘛那么麻煩
2008-01-24 08:50 | teli

# re: 今天做了一個Struct結構,作為游戲里面的包容器來使用,可以一次發送多個邏輯結構信息了,爽啊!!!  回復  更多評論   

提個建議,不要用摘要方式發文吧?每看一篇文章都要點擊鏈接進來,不方便。
2008-01-25 09:27 | Fox
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99re亚洲国产精品| 免费亚洲电影在线观看| 女女同性精品视频| 欧美不卡三区| 亚洲欧美激情诱惑| 在线亚洲高清视频| 亚洲午夜一二三区视频| 亚洲乱码一区二区| 亚洲作爱视频| 亚洲专区一区二区三区| 免费看成人av| 亚洲一区二区视频在线| 欧美日韩在线大尺度| 免费不卡视频| 国产精品理论片| 91久久一区二区| 欧美亚洲日本网站| 日韩一级在线| 久久精品国产亚洲精品| 欧美激情国产日韩| 韩国精品主播一区二区在线观看| 亚洲国产成人久久综合一区| 午夜久久资源| 欧美国产精品日韩| 午夜精品久久久久久久蜜桃app| 欧美精品免费观看二区| 欧美一区日韩一区| 亚洲人www| 久久人人97超碰人人澡爱香蕉| 欧美日韩一区二区在线| 亚洲黄色影院| 免费日韩成人| 欧美国产日产韩国视频| 国产日韩一区二区三区| 亚洲女与黑人做爰| 一区二区三区四区国产| 欧美成人精品福利| 亚洲毛片在线| 99在线精品观看| 欧美视频亚洲视频| 一本色道久久88综合亚洲精品ⅰ| 欧美黑人多人双交| 欧美福利电影网| 中日韩午夜理伦电影免费| 91久久精品美女| 欧美三级日韩三级国产三级| 亚洲一区欧美激情| 欧美亚洲专区| 99成人在线| 亚洲综合欧美| 99热免费精品| 久久琪琪电影院| 亚洲欧美日韩国产精品| 久久久久久久久久久一区| 日韩一级精品视频在线观看| 亚洲一区制服诱惑| 最新中文字幕亚洲| 亚洲一区二区三区免费观看| 国产一区91精品张津瑜| 99v久久综合狠狠综合久久| 国产最新精品精品你懂的| 亚洲一区影院| 亚洲一区二区高清视频| 亚洲国产国产亚洲一二三| 午夜精品一区二区三区四区| 一区二区三区国产精品| 美女脱光内衣内裤视频久久影院 | 在线播放亚洲| 99国产精品久久久| 日韩一区二区久久| 免费欧美在线视频| 久久综合免费视频影院| 国产精品久久看| 午夜视黄欧洲亚洲| 久久精品免费观看| 国产亚洲欧美日韩精品| 午夜精品视频网站| 久久一区中文字幕| 在线播放中文字幕一区| 美女精品一区| 在线一区欧美| 久久五月激情| 亚洲精品一级| 国产精品国产a级| 久久久人成影片一区二区三区| 快射av在线播放一区| 日韩一级黄色大片| 国产精品一区二区三区免费观看| 亚洲欧美在线高清| 久久蜜桃香蕉精品一区二区三区| 一区二区三区自拍| 欧美激情一区三区| 午夜精品影院| 亚洲深夜av| 欧美激情一区二区三区成人| 在线亚洲国产精品网站| 亚洲一级在线观看| 久久婷婷综合激情| 亚洲特黄一级片| 亚洲激情网址| 在线观看成人av| 国产精品久久久久久av福利软件| 久久免费高清视频| 欧美亚洲日本网站| 亚洲欧美激情精品一区二区| 日韩亚洲国产欧美| 亚洲精品一二区| 99精品久久免费看蜜臀剧情介绍| 亚洲电影欧美电影有声小说| 老司机aⅴ在线精品导航| 性欧美办公室18xxxxhd| 香蕉国产精品偷在线观看不卡| 亚洲一区二区三区影院| 亚洲无限av看| 久久精品99国产精品| 欧美一区国产在线| 久久亚洲欧洲| 欧美日韩精品国产| 国产精品视频久久久| 雨宫琴音一区二区在线| 国产一区高清视频| 亚洲精品在线一区二区| 亚洲成人在线| 亚洲欧美日韩精品久久奇米色影视 | 午夜精品成人在线| 午夜久久99| 欧美成人精品福利| 一本色道久久加勒比精品| 亚洲欧美日韩精品一区二区| 久久精品亚洲一区二区三区浴池 | 久久精品99国产精品日本| 欧美怡红院视频一区二区三区| 久久天天躁夜夜躁狠狠躁2022 | 亚洲国产精品va在线看黑人| 亚洲第一在线综合网站| 亚洲一区精彩视频| 久久色中文字幕| 国产精品久久久久久久久久直播 | 久久综合电影| 国产精品久久久久久久9999| 激情久久综合| 久久精品中文字幕免费mv| 亚洲国产99| 另类欧美日韩国产在线| 国产精品一区二区a| 亚洲愉拍自拍另类高清精品| 欧美成人免费全部| 欧美在线日韩精品| 激情视频一区二区三区| 欧美在线啊v一区| 午夜久久久久久| 国产午夜精品一区二区三区欧美 | 亚洲第一在线综合在线| 久久久久国产精品麻豆ai换脸| 亚洲综合色噜噜狠狠| 亚洲精品日韩在线观看| 欧美高清视频免费观看| 久久三级视频| 美女网站在线免费欧美精品| 亚洲经典在线| 一区二区三区四区五区视频 | 欧美精品久久久久久久| 亚洲欧美日韩一区二区| 欧美一二三区精品| 99re6热在线精品视频播放速度| 亚洲视频一区| 亚洲精品影视在线观看| 亚洲性人人天天夜夜摸| 久久激五月天综合精品| 欧美一区二区三区免费在线看| 亚洲福利国产精品| 美国三级日本三级久久99| 欧美制服丝袜第一页| 欧美日韩在线观看一区二区| 欧美成人免费小视频| 国产综合色产在线精品| 宅男噜噜噜66一区二区| 99精品视频一区| 国产精品亚洲欧美| 亚洲午夜av电影| 亚洲三级网站| 欧美国产日韩在线| 最新成人在线| 亚洲一级一区| 国产精品久久77777| 一本久久综合亚洲鲁鲁| 一本一道久久综合狠狠老精东影业| 老司机精品导航| 夜夜嗨av一区二区三区四季av | 亚洲人成精品久久久久| 欧美亚洲一区在线| 久久精品国产久精国产爱| 国产精品青草综合久久久久99 | 国产精品一区二区久久久久| 亚洲破处大片| 亚洲欧美激情在线视频| 国产精品美女久久久久aⅴ国产馆| 亚洲精品在线免费| 亚洲一区二区免费| 国产夜色精品一区二区av|