程序的天空

我的学习心得

导航

Quake2源码分析(2)

Posted on 2008-08-14 00:29  帕托  阅读(1969)  评论(4)    收藏  举报

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 ();            //滚动控制台