Quake原始碼分析 草稿 3

2021-04-07 05:49:14 字數 1321 閱讀 5981

訊息處理:

我把quake的訊息分為兩類,一種是常用輸入裝置產生的訊息,譬如keyboard,mouse,joystick等.

另一種就是網路或本地傳輸資料報時引發的訊息.

引擎中com_eventloop()函式負責將抓獲到的訊息根據事件的型別分發給對應的處理函式,

com_getevent()可以從com_eventqueue和eventqueue陣列佇列中獲取到所有的未處理訊息,

typedef enum syseventtype_s syseventtype_t;

typedef struct 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 ) )

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原始碼分析 草稿 3

訊息處理 我把quake的訊息分為兩類,一種是常用輸入裝置產生的訊息,譬如keyboard,mouse,joystick等.另一種就是網路或本地傳輸資料報時引發的訊息.引擎中 eventloop 函式負責將抓獲到的訊息根據事件的型別分發給對應的處理函式,getevent 可以從 eventqueue...

Quake原始碼分析 草稿 1

quake是id software公司推出一款風迷全球的fps遊戲.至今為止已經發展到了第三代,而且作為乙個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的cs,它就是在quake2引擎上改良而來的.雖然裡面的程式碼實現並不完全相同,但是整體框架還是quake2的,只要是稍...

Quake原始碼分析 草稿 4

quake網路部分總結 1 網路部分被分為接收和傳送兩個部分.2 傳送部份被分為本地資料報傳輸和異地資料報傳輸兩個部分.3 本地封包傳輸由net sendloopbackpacket 負責.4 異地封包傳輸由sys sendpacket 負責.5 資料報傳輸又可以分為單包傳輸和多包傳輸.6 net ...