訊息處理:
我把quake的訊息分為兩類,一種是常用輸入裝置產生的訊息,譬如keyboard,mouse,joystick等.
另一種就是網路或本地傳輸資料報時引發的訊息.
引擎中***_eventloop()函式負責將抓獲到的訊息根據事件的型別分發給對應的處理函式,
***_getevent()可以從***_eventqueue和eventqueue陣列佇列中獲取到所有的未處理訊息,
typedef enum syseventtype_s syseventtype_t;
typedef struct sysevent_t;
static sysevent_t ***_eventqueue[***_max_events];
static sysevent_t eventqueue[sys_max_events];
從以上的宣告部分我們可以看到***_eventqueue和eventqueue其實就是乙個sysevent_t結構的陣列.
這裡你可能要會問了,***_eventqueue裡面的資料又是從何而來的呢?當***_getevent()函式發現***_eventqueue裡面沒有資料的時候,例如程式剛啟動時,它會呼叫***_getrealevent()來蒐集未處理的訊息.然後再從eventqueue中讀出事件.
***_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中.
***_eventqueue
佇列事件
其實是通過***_pushevent()函式
把eventqueue
中的事件壓入到
***_eventqueue
中.quake採用這種雙佇列的方式來儲存訊息.
Quake原始碼分析 草稿 3
訊息處理 我把quake的訊息分為兩類,一種是常用輸入裝置產生的訊息,譬如keyboard,mouse,joystick等.另一種就是網路或本地傳輸資料報時引發的訊息.引擎中com eventloop 函式負責將抓獲到的訊息根據事件的型別分發給對應的處理函式,com getevent 可以從com ...
Quake原始碼分析 草稿 1
quake是id software公司推出一款風迷全球的fps遊戲.至今為止已經發展到了第三代,而且作為乙個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的cs,它就是在quake2引擎上改良而來的.雖然裡面的程式碼實現並不完全相同,但是整體框架還是quake2的,只要是稍...
Quake原始碼分析 草稿 4
quake網路部分總結 1 網路部分被分為接收和傳送兩個部分.2 傳送部份被分為本地資料報傳輸和異地資料報傳輸兩個部分.3 本地封包傳輸由net sendloopbackpacket 負責.4 異地封包傳輸由sys sendpacket 負責.5 資料報傳輸又可以分為單包傳輸和多包傳輸.6 net ...