游戏开发论坛

 找回密码
 立即注册
搜索
查看: 20565|回复: 24

HL2源码分析(框架篇)

[复制链接]

18

主题

92

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2003-10-23 18:22:00 | 显示全部楼层 |阅读模式
1.程序入口       作者:cproom (cproom)
-------------------------------------------------------------------------
程序入口在launcher_main\main.cpp中,装载launcher.dll

HINSTANCE launcher = LoadLibrary("launcher.dll");

定位并执行LauncherMain函数

LauncherMain_t main = (LauncherMain_t)GetProcAddress( launcher, "LauncherMain" );
return main( hInstance, hPrevInstance, lpCmdLine, nCmdShow );

LauncherMain函数完成部分初始化并进入游戏主函数Run

IEngineAPI *engineAPI = ( IEngineAPI * )LauncherFactory( VENGINE_LAUNCHER_API_VERSION, NULL );
if ( engineAPI )
{
        restart = engineAPI->Run( ( void * )hInstance, GetBaseDirectory(), LauncherFactory );
}

最关键的初始化函数是LoadAppSystems(),此函数查找定位各模块(.dll)的CreateInterface函数,这是各模块创建接口实例的工厂函数。此工厂函数的实现依赖于InterfaceReg类和与之配合的几个宏EXPOSE_INTERFACE_FN,EXPOSE_INTERFACE,EXPOSE_SINGLE_INTERFACE_GLOBALVAR,EXPOSE_SINGLE_INTERFACE创建的接口数据库来查找并创建接口。向接口数据库中加入一个接口实例的代码类似

static CEngineClient s_VEngineClient;
IVEngineClient *engineClient = &s_VEngineClient;
EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CEngineClient, IVEngineClient, VENGINE_CLIENT_INTERFACE_VERSION, s_VEngineClient );

每个模块都有独立的接口数据库,在模块载入时(LoadLibrary)由InterfaceReg的构造函数生成并链接起来。

有了这些工厂函数,就可以通过LauncherFactory函数查询需要的接口实例了。
上面用到的接口实例engineAPI就是这样得到的。

IEngineAPI *engineAPI = ( IEngineAPI * )LauncherFactory( VENGINE_LAUNCHER_API_VERSION, NULL );

这里说不太清楚,大家对照原码就清楚了。欢迎大家继续!


2.模块划分    作者:akun(疑无路)
--------------------------------------------------------------------------
我来说说hl2的模块划分, 每个模块中的接口(其他模块需要使用的)静态实例形成一个单向链表,对外暴露一个接口Factory, 通过这个Factory, 获得各个接口的实例指针。(每个模块dll都有一个CreateInterface的导出函数,通过这个函数获得接口Factory。接口单向链表的查找通过一个预定义的字符串,通过这个字符串还可以实现接口版本控制。具体大家可以参见
EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CEngineClient, IVEngineClient, VENGINE_CLIENT_INTERFACE_VERSION, s_VEngineClient );
这个宏。
)

下面就是5大模块了~
1. FileSystem.(Filesystem_stdio.dll)功能肯定是文件系统的包装了,打包解包咯~

2. MaterialSystem. (materialsystem.dll)这里是渲染的实现,包装了dx8,dx7等实现,包括是否可以使用shader, 以及相应的渲染方式。

3. Engine. (Engine.dll)这里就太庞大了,它的接口单向链表里面就有:CEngineTraceServer, CModelRender, CModelInfoServer, CModelInfoClient, CNetworkStringTableContainerClient,CNetworkStringTableContainerServer, CStaticPropMgr, CVEnginServer, CEngineSoundClient, CEnginSoundServer, CShadowManager, CVRednerView等等。太复杂,看名字可以知道大概干吗的,具体一点就不知道了~~^_^。

4. VGui2.(vgui2.dll)
5. vguimatsurface.(vguimatsurface.dll)这2个应该是gui了~


下面是游戏的具体实现了,使用client/server模式,这个模式具体什么样,还没看懂...
client.dll 在源码cl_dll那个目录里面。
server.dll 在hl那个目录。
这2个dll里面要调用上面的几个模块里面的接口来实现n多的功能的...
Tf2, hl2, hl1, cs的游戏规则都在这里实现,譬如Npc, 武器效果。


其他还有一些零散的模块。
tier0(tier0.dll),这个是比较底层的东东了,处理debug信息,时间,内存管理,游戏的录像,播放也在这里。
vphysics. 物理哦~~ivp目录里面是Ipion Virtual Physics SDK,有详细文档使用说明哦。
.......

下面大家补充。

请大家不要mark,不要up这些无意回复在里面。

3.游戏循环  作者:fohoo
--------------------------------------------------------------------------
hl2.exe -> laucher.dll -> engine.dll (swds.dll)

到了engine.run(),然后调RunListenServer
RunListenServer:
{
  ...
  game->init       //建主窗口 CreateMainWindow
  <Message Loop>  //消息泵
}

<Message Loop>
{
...
game->DispatchAllStoredGameMessages()//发布消息给Gui的Controls,进行回调
eng->frame(); //游戏设计中常见的Frame动作
...
}

eng->frame
{
  调CHostState::FrameUpdate( float time, int iState )  //状态机的状态循环
  {
      ...
      //看代码很清楚了
      switch( m_currentState )
     {
        case HS_NEW_GAME:   
           State_NewGame();
           break;
        case HS_LOAD_GAME:   //
           State_LoadGame();
           break;
        case HS_CHANGE_LEVEL_MP:
          State_ChangeLevelMP();
          break;
        case HS_CHANGE_LEVEL_SP:
          State_ChangeLevelSP();
          break;
        case HS_RUN:
          State_Run( time, iState );
          break;
        case HS_GAME_SHUTDOWN:
          State_GameShutdown();
          break;
        case HS_SHUTDOWN:
          State_Shutdown();
          break;
        case HS_RESTART:
          State_Restart();
          break;
   }
   ...  
}

State_Run( time, iState )
{
   ...
   Cbuf_execute   //当你输入map test时,先放入buffer,然后在这execute
   ...
}

hl2有一个重要ConCommand的类,可扩充要执行的命令

GUI的很多控件操作也就是将Command串放入command buffer中


每个Game有不同的server.dll,cient.dll
server.dll  设计场景,NPC..
client.dll  玩家的控制,...研究中..

当new game时

engine.dll会回调server.dll中IServerGameDLL接口GameInit来给
每个GAME初始化的机会

回调IServerGameDLL中的LevelInit装BSP地图()

然后回调IServerGameDLL的ServerActivate来启动GAME

...研究...待续...

个人理解,不对之处,敬请指正

大家一起分享提高吧,早日成就中国的CS!!

16

主题

76

帖子

105

积分

注册会员

Rank: 2

积分
105
发表于 2003-10-23 21:46:00 | 显示全部楼层

Re: HL2源码分析(框架篇)

good.

1

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2003-10-23 23:50:00 | 显示全部楼层

Re: HL2源码分析(框架篇)

nice

12

主题

94

帖子

99

积分

注册会员

Rank: 2

积分
99
发表于 2003-10-24 14:01:00 | 显示全部楼层

Re: HL2源码分析(框架篇)

45

主题

286

帖子

314

积分

中级会员

自由游戏制作人

Rank: 3Rank: 3

积分
314
QQ
发表于 2003-10-28 14:38:00 | 显示全部楼层

Re: HL2源码分析(框架篇)

呵呵

4

主题

26

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2003-10-28 17:53:00 | 显示全部楼层

Re: HL2源码分析(框架篇)

厉害!

7

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2003-10-28 18:07:00 | 显示全部楼层

Re: HL2源码分析(框架篇)


这个论坛的回帖很少有能和原帖媲美的

1

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2003-10-28 21:40:00 | 显示全部楼层

Re: HL2源码分析(框架篇)

的确不错,继续努力!

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2003-10-29 17:46:00 | 显示全部楼层

Re: HL2源码分析(框架篇)

感冒了一回,回来就发现自己落后了。555

2

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2003-11-10 00:47:00 | 显示全部楼层

Re: HL2源码分析(框架篇) 求教!!!

请问哪里有HL2的 UML类图可以下吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-5-20 07:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表