quake網路部分總結:
(1) 網路部分被分為接收和傳送兩個部分.
(2) 傳送部份被分為本地資料報傳輸和異地資料報傳輸兩個部分.
(3) 本地封包傳輸由net_sendloopbackpacket()負責.
(4) 異地封包傳輸由sys_sendpacket()負責.
(5) 資料報傳輸又可以分為單包傳輸和多包傳輸.
(6) net_sendpacket()可以傳送本地或異地不超過乙個封包大小的資料報.也就是單包傳輸.
(7) netchan_tran**it()
根據資料報的大小選擇傳輸方式,如果資料報大於乙個封包的尺寸,
那麼就呼叫netchan_tran**itnextfragment()函式,
將需要傳送的資料塊(max_msglen)切割成若干等大小(max_packetlen - 100)的封包,然後再啟動net_sendpacket()傳送.
否則如果資料報小於乙個封包的尺寸,那麼就直接呼叫net_sendpacket()傳送.
上述資料報被net_sendpacket()傳送前都會先被netchan_scramblepacket()進行加密(攪亂裡面的資料),然後再用cl_netchan_encode()給它們編碼.
這就是多包傳輸.
從上面的說明能夠看出其實多包傳輸最終還是要轉變為單包傳輸.
(8) 資料報接收也分為本地資料報接收和異地資料報接收.
(9) 本地資料報接收: net_getloopbackpacket()
(10) 異地資料報接收: sys_getpacket()
(11) 當系統接收到異地資料報時會觸發se_packet事件,這個事件到達com_eventloop()時,啟動cl_packetevent()處理客戶端傳送過來的資料報,
啟動sv_packetevent()處理伺服器端傳送過來的資料報.
cl_packetevent()cl_netchan_process()netchan_process()
sv_packetevent()sv_netchan_process()netchan_process()
對於那些多包的資料,交由cl_netchan_process()或sv_netchan_process()來處理,它會一直等到全部封包都接收下來後再呼叫
netchan_unscramblepacket()解密,接著用cl_netchan_decode()解碼.最後使用者就可以讀到完整的資料報了.
(12) 當系統接收到本地資料報時就直接啟動
cl_packetevent()或sv_packetevent()
而且不需要等待封包.因為這些封包沒有進入網路,所以
while( net_getloopbackpacket( ns_client, &adr, &msg ) )
while( net_getloopbackpacket( ns_server, &adr, &msg ) )
上面的迴圈可以把全部被切割的封包一次性全部讀出.
(13)
利用net_sendpacket()
直接傳送資料的函式有net_outofbandprint()net_sendpacket()
注:用net_outofbandprint()傳送出來的資料報,前四個位元組一定是ffffffff,即-1.
它們會被sv_connectionlesspacket()和cl_connectionlesspacket()處理.
Quake原始碼分析 草稿 4
quake網路部分總結 1 網路部分被分為接收和傳送兩個部分.2 傳送部份被分為本地資料報傳輸和異地資料報傳輸兩個部分.3 本地封包傳輸由net sendloopbackpacket 負責.4 異地封包傳輸由sys sendpacket 負責.5 資料報傳輸又可以分為單包傳輸和多包傳輸.6 net ...
Quake原始碼分析 草稿 3
訊息處理 我把quake的訊息分為兩類,一種是常用輸入裝置產生的訊息,譬如keyboard,mouse,joystick等.另一種就是網路或本地傳輸資料報時引發的訊息.引擎中 eventloop 函式負責將抓獲到的訊息根據事件的型別分發給對應的處理函式,getevent 可以從 eventqueue...
Quake原始碼分析 草稿 1
quake是id software公司推出一款風迷全球的fps遊戲.至今為止已經發展到了第三代,而且作為乙個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的cs,它就是在quake2引擎上改良而來的.雖然裡面的程式碼實現並不完全相同,但是整體框架還是quake2的,只要是稍...