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

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結構,作為游戲里面的包容器來使用,可以一次發送多個邏輯結構信息了,爽?。。。?a name="Post">  回復  更多評論   

提個建議,不要用摘要方式發文吧?每看一篇文章都要點擊鏈接進來,不方便。
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>
            欧美一区二区久久久| 你懂的成人av| 亚洲电影观看| 欧美国产精品人人做人人爱| 亚洲欧美精品在线| 欧美一区二区三区成人| 香蕉av777xxx色综合一区| 亚洲在线观看视频网站| 香蕉成人久久| 久久综合九色综合欧美就去吻| 免费观看一级特黄欧美大片| 欧美xx69| 欧美一区国产二区| 久久青草久久| 欧美激情视频网站| 国产精品一区二区在线观看| 国产一区二区日韩| 亚洲日韩第九十九页| 国产精品成人国产乱一区| 国产乱码精品| 亚洲第一在线视频| 亚洲深夜福利视频| 噜噜噜噜噜久久久久久91| 91久久精品一区| 亚洲视频在线一区观看| 久久精品国产第一区二区三区最新章节 | 一区二区激情| 欧美精品二区| 国产精品少妇自拍| 在线观看亚洲精品| 亚洲一区尤物| 另类天堂av| 亚洲视频高清| 欧美大秀在线观看| 国产精品一区二区a| 亚洲精品网站在线播放gif| 欧美一区二区日韩一区二区| 欧美大片免费久久精品三p | 久久亚洲综合| 欧美日韩一区二区在线播放| 国产一区二区| 亚洲视频高清| 亚洲高清av在线| 亚洲欧美另类中文字幕| 欧美激情国产日韩| 狠狠色丁香久久综合频道| 亚洲一区三区电影在线观看| 欧美激情亚洲精品| 久久久噜噜噜久噜久久| 国产精品亚洲а∨天堂免在线| 日韩视频在线观看| 欧美大片免费看| 久久人人爽人人爽| 狠狠色综合网| 久久人人看视频| 午夜日韩激情| 国产日产亚洲精品| 亚洲欧美怡红院| 一区二区三区回区在观看免费视频| 女主播福利一区| 亚洲三级影院| 欧美黄色成人网| 久久亚洲影院| 亚洲欧洲日夜超级视频| 欧美成人一品| 牛牛影视久久网| 亚洲免费av网站| 亚洲精品欧美精品| 欧美视频网站| 午夜精品一区二区三区在线视| 在线一区免费观看| 国产欧美日韩激情| 久久躁日日躁aaaaxxxx| 久久在线免费| 日韩天堂av| 亚洲一区二区网站| 国产一区二区日韩| 欧美国产高清| 欧美日韩国产色视频| 亚洲一区国产| 欧美在线观看一区二区三区| 影音先锋中文字幕一区二区| 欧美搞黄网站| 欧美午夜视频在线观看| 欧美在线影院| 麻豆成人av| 欧美日韩高清在线播放| 国产精品久久久久久久久久免费| 亚洲曰本av电影| 欧美一区二区网站| 亚洲国产91精品在线观看| 亚洲国产日韩欧美一区二区三区| 欧美在线观看网址综合| 伊人成人在线视频| 亚洲精品视频一区| 国产麻豆综合| 亚洲第一级黄色片| 国产精品视频你懂的| 久久亚洲国产精品日日av夜夜| 蜜乳av另类精品一区二区| 亚洲一区二区三区午夜| 久久av红桃一区二区小说| 亚洲精选中文字幕| 性欧美超级视频| 999在线观看精品免费不卡网站| 亚洲无玛一区| 日韩视频在线观看国产| 性欧美激情精品| 99精品视频网| 久久久蜜桃精品| 亚洲欧美日韩天堂| 欧美大片在线看| 免费高清在线视频一区·| 国产精品啊啊啊| 91久久精品视频| 红桃视频国产精品| 亚洲欧美日韩人成在线播放| 99热这里只有成人精品国产| 久久婷婷一区| 久久精品亚洲乱码伦伦中文 | 久久精品亚洲一区| 欧美日韩大片| 亚洲高清自拍| 亚洲二区在线视频| 欧美在线网址| 欧美在线一级va免费观看| 欧美特黄a级高清免费大片a级| 亚洲大片av| 亚洲精品欧美日韩| 老司机凹凸av亚洲导航| 美女视频黄a大片欧美| 国产伦精品一区二区三区照片91| 一区二区三区成人| 中文欧美在线视频| 欧美日韩免费观看一区三区 | 欧美bbbxxxxx| 狠狠干综合网| 另类图片国产| 裸体一区二区三区| 亚洲高清视频中文字幕| 美女网站在线免费欧美精品| 老司机一区二区| 亚洲成色777777在线观看影院| 欧美中文在线视频| 久久一区中文字幕| 亚洲国产精品久久久久| 国产精品久久久久久久久动漫| 久久久久久9999| 香蕉乱码成人久久天堂爱免费| 久久九九免费| 欧美黄色免费| 亚洲九九爱视频| 蜜臀久久久99精品久久久久久 | 亚洲大片在线| 久久激情综合| 久久久久88色偷偷免费| 国产伦精品免费视频| 中文有码久久| 在线综合+亚洲+欧美中文字幕| 欧美日韩成人在线观看| 亚洲国产一区二区三区在线播| 亚洲免费av电影| 国产精品入口66mio| 亚洲综合色噜噜狠狠| 老司机午夜精品| 亚洲大胆av| 国产精品狼人久久影院观看方式| 亚洲在线一区二区三区| 欧美一区二区性| 国产日韩欧美综合一区| 欧美中文字幕精品| 亚洲激精日韩激精欧美精品| 日韩视频不卡| 国产一区二区三区最好精华液| 日韩午夜中文字幕| 在线欧美电影| 欧美激情一级片一区二区| 最新热久久免费视频| 先锋a资源在线看亚洲| 国产日韩欧美一区| 欧美激情1区| 亚洲亚洲精品在线观看| 欧美激情黄色片| 久久精品国亚洲| 亚洲麻豆国产自偷在线| 国产视频综合在线| 另类综合日韩欧美亚洲| 亚洲欧美日韩人成在线播放| 亚洲欧美日韩一区| 亚洲精品1区| 国内精品久久久久影院 日本资源| 狼人社综合社区| 午夜精品久久久久久久蜜桃app| 麻豆精品网站| 久久精品官网| 99视频一区二区| 国产一区二区日韩精品欧美精品| 欧美日韩一级片在线观看| 欧美亚洲专区| 亚洲永久字幕|