Quake原始碼分析 草稿 4

2021-09-01 21:10:14 字數 3379 閱讀 5023

quake網路部分總結:

(1)網路部分被分為接收和傳送兩個部分.

(2)傳送部份被分為本地資料報傳輸和異地資料報傳輸兩個部分.

(3)本地封包傳輸由net_sendloopbackpacket()負責.

(4)異地封包傳輸由sys_sendpacket()負責.

(5)資料報傳輸又可以分為單包傳輸和多包傳輸.

(6)net_sendpacket()可以傳送本地或異地不超過乙個封包大小的資料報.也就是單包傳輸.

(7)netchan_transmit()

根據資料報的大小選擇傳輸方式,如果資料報大於乙個封包的尺寸,

那麼就呼叫netchan_transmitnextfragment()函式,

將需要傳送的資料塊(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網路部分總結:

(1)網路部分被分為接收和傳送兩個部分.

(2)傳送部份被分為本地資料報傳輸和異地資料報傳輸兩個部分.

(3)本地封包傳輸由net_sendloopbackpacket()負責.

(4)異地封包傳輸由sys_sendpacket()負責.

(5)資料報傳輸又可以分為單包傳輸和多包傳輸.

(6)net_sendpacket()可以傳送本地或異地不超過乙個封包大小的資料報.也就是單包傳輸.

(7)netchan_transmit()

根據資料報的大小選擇傳輸方式,如果資料報大於乙個封包的尺寸,

那麼就呼叫netchan_transmitnextfragment()函式,

將需要傳送的資料塊(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的,只要是稍...