|
- 最近对高性能的服务器比较感兴趣,读过了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
- {
- CHARszTmp[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:4810960x75748
- 知道了图片格式,我们可以写一个抓图片格式的程序了。
- 传奇源码分析-客户端(全局变量与总体执行流程)
- 客户端:
- 传奇的客户端源代码有两个工程,WindHorn和Mir2Ex。
- 先剖析一下WindHorn工程。
- 1.CWHApp、CWHWindow和CWHDXGraphicWindow。Window程序窗口的创建。
- CWHApp派生CWHWindow,CWHWindow又派生CWHDXGraphicWindow。CWHWindow类
- 中完成窗口的注册和创建。CWHDXGraphicWindow调用CWHWindow完成创建窗口功能,然后再调用CreateDXG()来初始化DirectX。
- 2.CWHDefProcess派生出CloginProcess、CcharacterProcess、CgameProcess三个类。
- 这三个类是客户端处理的核心类。
复制代码- 3. 全局变量:
- CWHDXGraphicWindowg_xMainWnd;主窗口类。
- CLoginProcess g_xLoginProc; 登录处理。
- CCharacterProcess g_xChrSelProc; 角色选择处理。
- CgameProcess g_xGameProc; 游戏逻辑处理。
- 4.代码分析:
- 1.首先从LoginGate.cpp WinMain分析:
- g_xMainWnd定义为CWHDXGraphicWindow调用CWHWindow完成创建窗口功能,然后
- 调用DirectDrawEnumerateEx枚举显示设备,(执行回调函数DXGDriverEnumCallbackEx) 再调用CreateDXG()来初始化DirectX(创建DirectDraw对象, 取得独占和全屏模式, 设置显示模式等)。
- g_xSound.InitMirSound创建CSound对象。
- g_xSpriteInfo.SetInfo();
- 初始化声音,加载Socket库之后,进行CWHDefProcess*指针赋值(事件绑定)。g_bProcState变量反应了当前游戏的状态(登录,角色选择,游戏逻辑处理)。调用Load初始化一些操作(登录,角色选择,游戏逻辑处理)。进行消息循环。
- case _LOGIN_PROC:
- g_xLoginProc.RenderScene(dwDelay);
- case _CHAR_SEL_PROC:
- g_xChrSelProc.RenderScene(dwDelay);
- case _GAME_PROC:
- g_xGameProc.RenderScene(dwDelay);
- 根据g_bProcState变量标志,选择显示相应的画面。
- 2.接收处理网络消息和接收处理窗口消息。
- 在不同的状态下(登录,角色选择,游戏逻辑处理),接收到的消息(网络,窗口消息)会分派到不同的函数中处理的。这里是用虚函数处理(调用子类方法,由实际的父类完成相应的处理)。
- OnMessageReceive主要处理网络消息。DefMainWndProc则处理窗体消息(按键,重绘等),创建窗体类为CWHDXGraphicWindow,回调函数为:
- MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- if ( m_pxDefProcess )
- m_pxDefProcess->DefMainWndProc(hWnd, uMsg, wParam, lParam);
- else
- return MainWndProcDXG(hWnd, uMsg, wParam, lParam);
- m_pxDefProcess->DefMainWndProc调用父类的实际处理。
- 在WM_PAINT事件里: g_xClientSocket
- ConnectToServer连接登陆服务器。
- 传奇源码分析-客户端(传奇2文件格式分析)
- 传奇文件类型格式探讨(一):
- Wix文件:索引文件,根据索引查找到相应数据地址(数据文件)。
- // WIX 文件头格式
- typedef struct tagWIXFILEIMAGEINFO
- {
- CHARszTmp[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色的调色板。而Wil里面的图片格式都是256色的位图储存。
- 我们看到图片位置数据为: 20 03 58 02, 转化为十六进制: 0x320, 0x258 刚好就是800*600大小的图片。07 00 D4 FF为固定值(标识)。图片起始位置为:
- Ofs 1088: 0x440 图片大小为480000
- 起始位置:0x440 1088 终止位置:0x7573F 481087 为了验证数据是否正确,我们通过Wil工具,把第一幅图片导出来,然后用Hedit编辑器打开,经过对比,我们发现,数据一致。大小一致。
- 大家看到图片1的结束位置为0fs 481077,减去1080+1 = 480000刚好800*600大小。
- 我们用Wil抓图工具打开看一下(确定是800*600大小):
- 我们导出第二张BMP图片
- 图片的大小为:496* 361, 我们从Wix中读出第二张图片的索引位置:
- 根据贴图,我们发现第二张图片的索引位置为: 40 57 07 00,转换为十六进制:0x75740,即为:481088,前面我们讲到第一张图片的结束位置是: 0fs 481077,从Wix中读出来的也刚好为第二张图片的起始位置:
- (我们分析Wil中的第二张图片,起始位置:0x75740 481088) : F0 01 69 01为图片长宽: 0x1F0, 0x169 为496* 361 。 07 00 D4 FF为固定值(标识)。
- 我们用工具打开第二张BMP图片,从起始位置,一直选取中至结束,发现刚好选496* 361字节大小。两边数据对比之后发现一致。知道了图片格式,我们可以写一个抓图片格式的程序了。
复制代码
查看完整的传奇3客户端研究资料
|
上一篇: 传奇3源码研究资料说明书下一篇: 传奇3服务端源码 修正版 光通1.45官方源码
|