Quake2引擎的主循环:
在sys_win.c中,我们找到了WinMain函数,它完成的功能主要如下:
Qcommon_Init (argc, argv); //初始化Qcommon
oldtime = Sys_Milliseconds (); //计时
/* main window message loop */ //主要的消息循环
while (1)
{
// if at a full screen console, don't update unless needed
if (Minimized || (dedicated && dedicated->value) )
{
Sleep (1); //如果窗口是最小化状态,则睡眠1毫秒
}
//如果消息队列中有消息,则处理消息,否则进行下一步
while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage (&msg, NULL, 0, 0)) //整个循环退出点在这里
Com_Quit ();
sys_msg_time = msg.time;
TranslateMessage (&msg);
DispatchMessage (&msg);
}
do //这里做一个1毫秒的延时,确保每一次循环至少有1毫秒的时间
{
newtime = Sys_Milliseconds ();
time = newtime - oldtime;
} while (time < 1);
Qcommon_Frame (time); //Qcommon_Frame是引擎每桢执行的函数,我们将追踪这个函数
oldtime = newtime;
}
Qcommon_Frame追踪:
Qcommon_Frame:
SV_Frame(作为服务器端每桢)
SV_CheckTimeouts (); //当客户端超时时,丢掉这个客户端
SV_ReadPackets (); //接受客户端的数据包,执行客户端的命令
SV_CalcPings (); //计算每个客户端的ping值(延迟桢数)
SV_GiveMsec (); //给一些客户端1800毫秒的时间来传输命令
SV_RunGameFrame (); //让所有物体思考和移动,这里执行ge->RunFrame ();
//ge就是game_export,在这里运行整个游戏逻辑部分
SV_SendClientMessages (); //给每个连接的客户端发送消息
SV_RecordDemoMessage (); //记录一些信息
Master_Heartbeat ();
SV_PrepWorldFrame (); //准备下一桢的player处理
CL_Frame(作为客户端每桢)
IN_Frame (); //根据状态激活或反激活鼠标
CL_ReadPackets (); //接受服务器的数据包,解析服务器消息
CL_SendCommand (); //向服务器发送命令,根据键盘,鼠标,console命令等发送
CL_PredictMovement (); //经过确认,移动新的位置,如果没确认,预测新的位置
VID_CheckChanges (); //处理可能发生的视频配置信息的改变
SCR_UpdateScreen (); //视频更新,这是一个比较复杂的函数,设计到了图形系统的函数,将在后详述
ref_export.BeginFrame
...
ref_export.EndFrame
S_Update //每一桢处理声音的更新
CDAudio_Update(); //CD音频的更新
CL_RunDLights (); //更新动态光源cdlight_t的半径
CL_RunLightStyles (); //更新光源样式clightstyle_t的值
SCR_RunCinematic (); //更新每桢的调色板等屏幕参数
SCR_RunConsole (); //滚动控制台
浙公网安备 33010602011771号