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

cloud

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  29 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

常用鏈接

留言簿(5)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

    最近在游戲編程精粹4(Game Programming Gems 4)中看到了對于XDS的介紹,解開了我對于XML低效的困惑。也許在小型的XML應用中不覺得,但是在大數據量的應用中XML的速度甚至無法和普通的.ini相提并論。首先讓我們來看看XDS是什么吧。
 
    XDS技術由DSD和XDS兩種文件格式組成。前者跟XSD相似,后者跟XML相似,只不過這兩種格式都是二進制的。正是采用了二進制格式,無論是在體積還是在速度上XDS的性能比XML都有明顯的提升。目前支持XDS的免費庫主要有XDSToolkit,現在可以下載到1.03版本。這是一個開源項目,解壓后我們可以看到它由兩個工具一個API包組成,另外還附一個例子。兩個工具的名字分別叫做xdsConvert和xdsMakeSchema,分別是用來進行XML和XDS相互轉換,以及生成DSD文件的。
 
    在一個C/C++項目中,我們經常需要用struct定義一系列數據結構。xdsMakeSchema就可以通過輸入數據結構的定義文件.h來生成DSD和相應的c頭文件。在一個項目的初期,你可能需要用XML編輯器來編寫這個項目所需要的XML數據,然后在程序中通過XDSLiteAPI來進行解析。這套API有兩個Paser,一個服務于XML,另一個服務于XDS。當你的項目完全可以自動生成XML的時候就可以由XML轉向XDS了。游戲編程精粹中解釋的很詳細,這邊就說說需要注意的地方了。
 
    要利用API對XDS進行解析需要以下步驟:
①     以struct定義的C數據類型
②     XDS的數據類型定義,可以在DSD中,也可以在程序中定義
③     回調函數的編寫,主要是XDS_PROCESSNODE函數
 
以該工具包附帶的Powerup為例,struct看起來是這樣的:
struct PowerUp_t {
    char szName[10];        // display name
    char szImage[16];       // image file name
 
    // health increase/decrease (-128 to 127)
    signed char   iHealth;
 
    // temporary abilities/penalties
    // (value is duration in seconds)
    unsigned char iInvulnerability;
    unsigned char iFastMove;
    unsigned char iHighJump;
    unsigned char iStunPlayer;
 
    // extra life (count)
    unsigned char iLifeUp;
};
 
// global power-up definition cache
extern struct PowerUp_t *g_PowerUps;
 
可以通過使用xdsMakeSchema來生成dsd,同時生成的xxxx_dsd.h只是為了免除將dsd文件讀入內存,查看它的內容就可以看到它定義了一個dsd數組:
// XDS DSD literal -- use this in calls to xdsInit()
//
#ifdef DEFINE_DSD
 
const unsigned char XDSDSD_Powerups[216] = {
    0x58, 0x44, 0x53, 0x21, 0x30, 0x33, 。。。
};
 
#else
 
extern const unsigned char XDSDSD_Powerups[216];
 
#endif
 
 
// XDS DSD IDs -- use these in implementation of XDS_PROCESSNODE()
//
#define XDS_Powerups_Powerup    0x0100 // Record
#define XDS_Powerups_PowerUp_t 0x0101 // Type
#define XDS_Powerups__xdsType1 0x0102 // Type
#define XDS_Powerups_g_PowerUps 0x0103 // Element
 
同時還定義了一些常量,這些常量在解析xds中會用到。
除了在dsd中對于xds格式的定義之外,我們還可以在main.cpp中看到程序內的定義:
#ifdef XDS_SUPPORT_DEFTYPE
void regDsd(struct xdsHandle *hXds)
{
    // Register my types (test only)
 
    xdsDefRecord(hXds, "Powerup", 2);
 
    unsigned short iStructType = xdsDefStructType(hXds, "PowerUp_t");
    xdsDefStructField(hXds, iStructType, "szName", XDS_TYPE_CHAR, 10);
    xdsDefStructField(hXds, iStructType, "szImage", XDS_TYPE_CHAR, 16);
    xdsDefStructField(hXds, iStructType, "iHealth", XDS_TYPE_CHAR, 0);
xdsDefStructField(hXds, iStructType, "iInvulnerability", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iFastMove", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iHighJump", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iStunPlayer", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iLifeUp", XDS_TYPE_BYTE, 0);
 
    xdsDefStructDone(hXds, iStructType);
    unsigned short iArrayType = xdsDefArrayType(hXds, "_xdsType1", iStructType, 0, 2);
 
    xdsDefElement(hXds, "g_PowerUps", iArrayType, 0);
}
#endif
 
    注意:交叉使用dsd定義和程序定義容易造成一個錯誤,就是在程序和dsd可能在定義的時候沖突,數據類型沖突,或者數據長度沖突,從而導致程序的崩潰。附帶的例子中程序定義數據類型如下:
#ifdef XDS_SUPPORT_DEFTYPE
void regDsd(struct xdsHandle *hXds)
{
    // Register my types (test only)
 
    xdsDefRecord(hXds, "Powerup", 4);
 
    unsigned short iStructType = xdsDefStructType(hXds, "PowerUp_t");
    xdsDefStructField(hXds, iStructType, "szName", XDS_TYPE_CHAR, 10);
    xdsDefStructField(hXds, iStructType, "szImage", XDS_TYPE_CHAR, 16);
    xdsDefStructField(hXds, iStructType, "iHealth", XDS_TYPE_CHAR, 0);
    xdsDefStructField(hXds, iStructType, "iInvulnerability", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iFastMove", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iHighJump", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iStunPlayer", XDS_TYPE_BYTE, 0);
    xdsDefStructField(hXds, iStructType, "iLifeUp", XDS_TYPE_BYTE, 0);
 
    xdsDefStructDone(hXds, iStructType);
    unsigned short iArrayType = xdsDefArrayType(hXds, "_xdsType1", iStructType, 0, 2);
 
    xdsDefElement(hXds, "g_PowerUps", iArrayType, 0);
}
#endif
 
要是在生成dsd時用參數-r Powerup:2而這里用xdsDefRecord(hXds, "Powerup", 4)的話就會導致沖突。
posted on 2008-11-12 15:34 cloud 閱讀(786) 評論(0)  編輯 收藏 引用 所屬分類: c++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            黑丝一区二区| 国产亚洲人成网站在线观看 | 国产字幕视频一区二区| 亚洲一区精彩视频| 亚洲一区免费视频| 国产午夜精品全部视频播放| 欧美一区免费视频| 亚洲欧美在线播放| 国外视频精品毛片| 亚洲精品久久久久| 国产精品视频导航| 免费国产一区二区| 欧美日韩亚洲一区二| 欧美一区二区成人6969| 久久一区视频| 亚洲一区二区三区在线视频| 午夜激情综合网| 亚洲国产婷婷香蕉久久久久久| aa亚洲婷婷| 亚洲主播在线| 亚洲日本中文字幕区| 亚洲香蕉在线观看| 亚洲国产日韩综合一区| 一区二区免费在线视频| 激情综合色丁香一区二区| 亚洲欧洲一区| 国内激情久久| 一区二区精品国产| 亚洲国产精品专区久久| 亚洲一区二区三区四区五区黄| 久久中文精品| 欧美一区二区黄| 欧美激情精品久久久久久变态| 国产一区在线视频| av成人免费在线观看| 一区视频在线播放| 亚洲综合色网站| 野花国产精品入口| 久久久久五月天| 亚洲无线视频| 蜜桃久久精品一区二区| 欧美一区二区三区的| 欧美福利视频在线| 美女爽到呻吟久久久久| 国产精品亚洲综合天堂夜夜| 亚洲精品一区二区三| 国产一区二区三区成人欧美日韩在线观看 | 亚洲私人影院| 免费人成网站在线观看欧美高清| 国产色产综合产在线视频| 亚洲人成绝费网站色www| 好男人免费精品视频| 亚洲免费在线精品一区| 一区二区三区欧美在线| 久久久国产一区二区三区| 午夜精品婷婷| 国产精品普通话对白| 一二三四社区欧美黄| 99国产一区| 欧美粗暴jizz性欧美20| 亚洲国产欧美一区| 亚洲激情av| 免费亚洲电影在线观看| 欧美激情自拍| 亚洲三级电影全部在线观看高清| 亚洲国产欧美日韩另类综合| 亚洲成人资源| 欧美成人有码| 亚洲三级电影全部在线观看高清| 欧美激情按摩在线| 亚洲国产导航| 在线视频你懂得一区| 欧美午夜不卡影院在线观看完整版免费 | 老司机成人在线视频| 老司机亚洲精品| 亚洲国产99精品国自产| 欧美xxx在线观看| 亚洲另类在线视频| 亚洲欧美日韩高清| 国内精品久久久久影院色| 久久精品视频免费| 欧美激情久久久久久| 一片黄亚洲嫩模| 国产精品久久久久久久久久久久久| 久久精品卡一| 亚洲国产高清aⅴ视频| 久久久久久9999| 亚洲精品男同| 欧美一区二区三区在| 亚洲成人在线| 国产精品九九久久久久久久| 欧美一区二区三区啪啪| 欧美成人激情视频| 亚洲一区二区精品在线观看| 国产日韩欧美成人| 欧美α欧美αv大片| 一区二区三区高清在线观看| 久久久久久久欧美精品| 日韩视频专区| 国产嫩草影院久久久久| 欧美a级一区二区| 亚洲欧美日韩中文视频| 亚洲国产精品传媒在线观看 | 国产精品免费一区豆花| 久久久久久久久一区二区| 亚洲精品视频在线| 久久久久一区二区三区| 一区二区三区高清不卡| 国产一区二区高清视频| 欧美精品粉嫩高潮一区二区| 午夜精品免费视频| 亚洲精品日日夜夜| 老司机午夜精品视频| 一本色道婷婷久久欧美| 亚洲电影自拍| 国产色产综合色产在线视频 | 久热爱精品视频线路一| 国产精品99久久久久久久vr| 韩国福利一区| 国产精品久久久999| 欧美激情精品久久久久| 久久久久国产精品午夜一区| 亚洲韩国青草视频| 国产日韩1区| 国产精品xvideos88| 欧美另类一区二区三区| 欧美成人免费播放| 久久久久久久久久看片| 亚洲欧美欧美一区二区三区| 亚洲精品久久久久久久久久久| 亚洲精品日韩在线观看| 激情久久综合| 国产揄拍国内精品对白| 国产欧美另类| 国产精品一区二区在线观看| 欧美日韩国产一区二区三区| 欧美jizzhd精品欧美巨大免费| 亚洲国产欧美一区二区三区久久| 亚洲经典在线| 亚洲第一在线综合网站| 国内成人精品视频| 国产一区二区三区久久精品| 国产午夜精品一区二区三区欧美 | 欧美日韩亚洲高清| 欧美精品一区三区在线观看| 欧美精品福利视频| 欧美日韩小视频| 国产精品电影网站| 国产精品视频免费观看www| 国产精品欧美日韩一区| 国产精品视频精品视频| 国产视频在线观看一区| 国产一区二区黄| 亚洲成人在线观看视频| 亚洲精品视频一区| 艳女tv在线观看国产一区| 中文av字幕一区| 亚洲欧美一区二区精品久久久| 在线播放国产一区中文字幕剧情欧美| 久久久久久久久久看片| 久久综合亚洲社区| 欧美麻豆久久久久久中文| 国产精品jizz在线观看美国 | 一区二区精品在线观看| 亚洲一区二区精品视频| 亚洲免费视频在线观看| 欧美在线一区二区| 欧美顶级少妇做爰| 国产精品久久久久秋霞鲁丝| 国产最新精品精品你懂的| 亚洲人成啪啪网站| 亚洲欧美日韩国产成人精品影院| 亚洲第一偷拍| 亚洲少妇在线| 久色成人在线| 国产精品99久久不卡二区| 久久精品一区| 国产精品白丝黑袜喷水久久久| 蜜桃久久av| 国产精品一区二区欧美| 在线免费观看日韩欧美| 99在线精品视频| 久久精品亚洲精品国产欧美kt∨| 亚洲午夜日本在线观看| 久久精品欧洲| 亚洲精品你懂的| 亚洲欧美在线网| 欧美看片网站| 1769国产精品| 欧美一区2区三区4区公司二百| 在线视频精品| 免费观看在线综合色| 亚洲天天影视| 欧美freesex交免费视频| 国产视频综合在线| 亚洲欧美激情精品一区二区| 老司机亚洲精品| 亚洲欧美一区二区激情| 欧美精品首页| 亚洲精品国产视频|