Quake源代碼分析(草稿).3

原创 2006年05月18日 14:25:00

消息處理:
       我把Quake的消息分為兩類,一種是常用輸入設備產生的消息,譬如KeyBoard,Mouse,JoyStick等.
       另一種就是網絡或本地傳輸數據包時引發的消息.
       引擎中Com_EventLoop()函數負責將抓獲到的消息根據事件的類型分發給對應的處理函數,
Com_GetEvent()可以從com_eventQueue和eventqueue數組隊列中獲取到所有的未處理消息,
typedef enum sysEventType_s {
 SE_NONE,   // evTime is still valid
 SE_KEY,    // evValue is a key code, evValue2 is the down flag
 SE_CHAR,   // evValue is an ascii char
 SE_MOUSE,   // evValue and evValue2 are reletive signed x / y moves
 SE_JOYSTICK_AXIS, // evValue is an axis number and evValue2 is the current state (-127 to 127)
 SE_CONSOLE,   // evPtr is a char*
 SE_PACKET   // evPtr is a netadr_t followed by data bytes to evPtrLength
} sysEventType_t;
 
typedef struct {
    int    evTime;
    sysEventType_t evType;
    int    evValue, evValue2;
    int    evPtrLength; // bytes of data pointed to by evPtr, for journaling
    void   *evPtr;   // this must be manually freed if not NULL
} sysEvent_t;
    static sysEvent_t com_eventQueue[COM_MAX_EVENTS];
    static sysEvent_t eventqueue[SYS_MAX_EVENTS];
從以上的聲明部分我們可以看到com_eventQueue和eventqueue其實就是一個sysEvent_t結構的數組.
         這裡你可能要會問了,com_eventQueue裡面的數據又是從何而來的呢?當Com_GetEvent()函數發現com_eventQueue裡面沒有數據的時候,例如程序剛啟動時,它會調用Com_GetRealEvent()來蒐集未處理的消息.然後再從eventqueue中讀出事件.

        Com_GetRealEvent()àSys_GetEvent()àSys_PumpEvents()
       

         Sys_PumpEvents()使用消息循环體(
      while( PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE ) ) {
         if( !GetMessage( &msg, NULL, 0, 0 ) ) {
         Sys_Quit();
         }
         TranslateMessage( &msg );
         DispatchMessage( &msg );
      })
     先将消息交由WndProc()处理,然后WndProc()再把诸如按键,鼠標移動等外部设备输入信息通过调用Sys_QueEvent()函数存储到全局队列eventqueue中。

另外Sys_PumpEvents()還會調用Sys_GetPacket(),將從Socket讀到的網絡數據也通過Sys_QueEvent()函数存放到eventqueue.
        com_eventQueue
隊列事件其實是通過Com_PushEvent()函數eventqueue中的事件壓入到com_eventQueue.Quake採用這種雙隊列的方式來保存消息.

QUAKE系列引擎以及基于QUAKE扩展引擎的源代码分析

前言: 一:研究quake系列引擎断断续续也已经两年有余了,一直想写点什么,但是真的到了那一步,又发现其实很难下笔,原因有三:1 文笔不流畅,特别是技术性技巧的缺乏,概念难以精确定义,无法想内心的真实...
  • Chinamming
  • Chinamming
  • 2013年11月25日 01:24
  • 1410

计算机与数学 —— 雷神之锤3源码中的快速逆平方根算法

这篇博客介绍了在雷神之锤3源代码中快速求逆平方根的算法。
  • noahzuo
  • noahzuo
  • 2016年06月01日 18:39
  • 2926

Hexo 入门指南(三) - 文章 & 草稿

新建文章 命令行中输入: $ hexo new "new article" 之后在source/_posts目录下面,多了一个new-article.md的文件。 打开之后我们会看到: ti...
  • wizardforcel
  • wizardforcel
  • 2014年11月01日 20:43
  • 7798

Quake源代碼分析(草稿).3

消息處理:        我把Quake的消息分為兩類,一種是常用輸入設備產生的消息,譬如KeyBoard,Mouse,JoyStick等.        另一種就是網絡或本地傳輸數據包時引發的消息....
  • Chinamming
  • Chinamming
  • 2013年11月25日 01:15
  • 668

Quake源代碼分析(草稿).1

Quake是Id Software公司推出一款風迷全球的FPS遊戲.至今為止已經發展到了第三代,而且作為一個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的CS,它就是在Qu...
  • Chinamming
  • Chinamming
  • 2013年11月25日 01:14
  • 638

Quake源代碼分析(草稿).4

Quake網絡部分總結: (1) 網絡部分被分為接收和傳送兩個部分. (2) 傳送部份被分為本地數據包傳輸和異地數據包傳輸兩個部分. (3) 本地封包傳輸由NET_SendLoopbackPacket...
  • Chinamming
  • Chinamming
  • 2013年11月25日 01:16
  • 618

从Quake 3源代码分析AI Bot库

从Quake 3源代码分析AI Bot库 2008年1月14日,Alex J. Champandard 查看已发布的标题的AI源代码是从渠道中学习技巧的好方法。这个新专栏可以帮助您...
  • tailiangliang
  • tailiangliang
  • 2017年07月29日 19:48
  • 415

QUAKE 3源代码评测:架构

QUAKE 3源代码评测:架构(第1部分,共5部分)>> 由于我在下一个合同前一个星期,我决定完成我的“循环ID”。后末日,末日iPhone,Quake1,Quake2中,德军iPhone和毁灭...
  • tailiangliang
  • tailiangliang
  • 2017年07月29日 19:05
  • 422

quake3源代码整体印象及基于其的开源引擎项目

总体而言 , quake 系列引擎的整体架构非常漂亮 , 是学习的好材料 。 并且从 quake1 到 quake3, 整体逻辑端代码变化不大 , 真正比较有突破性的是渲染引擎。 . 本人在学习 qu...
  • pizi0475
  • pizi0475
  • 2011年06月16日 11:24
  • 2025

QUAKE 3源代码审查:渲染器

QUAKE 3源代码评论:RENDERER(第2部分,共5部分)>> Quake III渲染器是Quake II硬件加速渲染器的演变:经典部分是建立在“二进制分区”/“潜在可见集”架构上,但...
  • tailiangliang
  • tailiangliang
  • 2017年07月30日 08:42
  • 248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Quake源代碼分析(草稿).3
举报原因:
原因补充:

(最多只允许输入30个字)