訊息處理:
我把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 ...