簡述:
最近對高性能的服務器比較感興趣,讀過了DELPHI的Socker源碼WebService及RemObject之後,高性能的服務器感興趣。
妳可能需要的以下知識才能更好的讀懂壹個商業源碼:
1).SOCKET的I/O模型熟悉掌握。
2).面向對象技術的熟悉掌握。
3).Socket的API掌握。
4).多線程技術等。
5).壹門熟悉的開發工具掌握,和多種語言的源碼閱讀能力。
我下的源碼 LegendOfMir2_Server:***包含AdminCmd, DBSrv, GameGate, GameSvr,LoginGate, LoginSvr, SelGate七個工程文件。傳奇的客戶端源代碼有兩個工程,WindHorn和Mir2Ex。
我分析的, 主要是VC SQL版本的, DELPHI翎風源碼不做分析, 另外下載了樂都WIL編輯器和樂都MPA地圖編輯器這些工具.
傳奇源碼分析-客戶端(WindHorn簡述和傳奇文件格式分析)
DirectX類庫分析(WindHorn):
1. RegHandler.cpp 註冊表訪問(讀寫)。
2. CWHApp派生CWHWindow,CWHWindow完成窗口的註冊和創建。CWHWindow派生出CWHDXGraphicWindow,CWHDXGraphicWindow調用CWHWindow完成創建窗口功能,然後再調用CreateDXG()來初始化DirectX。
3. WHDefProcess.cpp在構造函數中獲得CWHDXGraphicWindow句柄。
Clear函數中調用在後臺緩存上進行繪圖操作,換頁至屏幕。
ShowStatus函數,顯示狀態信息。
DefMainWndProc函數,調用CWHDXGraphicWindow->MainWndProcDXG消息處理。
4. WHImage.cpp圖象處理。加載位圖,位圖轉換。優化處理。
5. WHSurface.cpp 主頁面處理。
6. WHWilTexture.cpp 材質渲染。
WILTextureContainer: WIL容器類。m_pNext指向下壹個WILTextureContainer,單鏈表。
7. WHWilImage.cpp 從Data目錄中加載Wix文件(內存映射)。
8. WHDXGraphic.cpp 處理DirectX效果。
文件類型格式探討:
Wix文件:索引文件,根據索引查找到相應數據地址(數據文件)。
// WIX 文件頭格式
typedef struct tagWIXFILEIMAGEINFO
{
CHAR szTmp[40]; // 庫文件標題 'WEMADE Entertainment inc.' WIL文件頭
INT nIndexCount; // 圖片數量
INT* pnPosition; // 位置
}WIXIMAGEINFO, *LPWIXIMAGEINFO;
我們下載壹個Hedit編輯器打開壹個Wil文件,分析壹下。我們發現Wix文件中,0x23地址(含該地址)以前的內容是都相同的,即為:#INDX v1.0-WEMADE Entertainment inc.
Ofs44 0x2C的地方:存放著0B 00 00 00,高低位轉換後為:0xB轉換十進制數為11(圖片數量)Ofs48 0x30的地方:存放著38 04 00 00,高低位轉換後為:0x438 = 1080, 這個就是圖象數據的開始位置。
我們用Wil編輯打開對應的Wil文件,發現,果然有11張圖片。另外我們發現,在Ofs = 44 -47之間的數據總是38 04 00 00,終於明白,所有的圖片起始位置是相同的。
Wil文件: 數據文件。
前面我們說了圖象數據的開始位置為0x438 = 1080, 1080中有文件開頭的44字節都是相同的。所以,就是說有另外的1036字節是另有用途。1036中有1024是壹個256色的調色板。
我們看到圖片位置數據為: 20 03 58 02, 轉化為十六進制: 0x320, 0x258 剛好就是800*600大小的圖片。07 00 D4 FF。圖片起始位置為:
Ofs 1088: 0x440 圖片大小為480000
起始位置:0x440 1088 終止位置:0x7573F 481087 為了驗證數據是否正確,我們通過Wil工具,把第壹幅圖片導出來,然後用Hedit編輯器打開,經過對比,我們發現,數據壹致。大小壹致。
第二張BMP圖片(圖片起始位置:0x436 10078) : F0 01 69 01 , 07 00 D4 FF
剛好大小。第二張Wil起始位置:Ofs:481096 0x75748
知道了圖片格式,我們可以寫壹個抓圖片格式的程序了。
傳奇源碼分析-客戶端(全局變量與總體執行流程)
客戶端:
傳奇的客戶端源代碼有兩個工程,WindHorn和Mir2Ex。