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()處理.
相关推荐
quake3源码分析资料集锦
网络上收集的quake3源码分析资料,感谢原创作者的无私奉献。第二人生和传奇的代码分析优快云上就有,一并感谢各位资深的贡献!
quake3源代码整体印象及基于其的开源引擎项目
总体而言 , quake 系列引擎的整体架构非常漂亮 , 是学习的好材料 。 并且从 quake1 到 quake3, 整体逻辑端代码变化不大 , 真正比较有突破性的是渲染引擎。 . 本人在学习 quake 引擎过程中常常敬佩卡马克的想象力 ,api 函数是如此之简洁 , 整体框架是如此之完美 , 面向对象的 c 写得如此之漂亮 。 通过 quake 引擎 , 可以学到游戏设计的各...
quake:Quake的源代码,有史以来最好的游戏之一-one source code
quake:Quake的源代码,有史以来最好的游戏之一
quake3代码C++改写,Cmd_AddCommand改写
一、quake3在性能方面的做了很大的优化,如:1. 自己的内存分配机制,memzone 2. 自己的底层函数,memcpy等 改写为C++后应该保证系统原来的性能,我主要从以下方面考虑1。 不使用stl,异常。stl库是c++相对c性能差的主要原因,因此坚决不能用。2。采用对象缓冲池机制,在系统初始化构造所有对象,尽量避免动态构造对象。3. 保持原来底层函
ElasticSearch集群搭建
docker安装es集群
SAP CO-PA数据传送避坑指南:销售开票与FI/MM记账的日常配置实操(含KEKF/KE4I/KEI2)
本文深入解析SAP CO-PA数据传送中的常见配置问题,特别是销售开票与FI/MM记账环节的实操避坑指南。通过KEKF/KE4I/KEI2等关键配置点的详细说明,帮助用户避免数据失真和重复记录,提升获利能力分析的准确性。文章结合实战案例,揭示官方文档未提及的'数据黑洞'形成机制,为SAP顾问提供实用的排雷手册。
Quake-III原代码里的神奇的浮点sqrt()函数
最令人惊讶的是平方根函数sqrt()。课本里说的,基本上是牛顿跌代法,通过若干步的叠代,结果越来越接近真实结果。 但q_math.c里面却给出了这样奇异的平方根函数:(我的注释) float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = numb
高分三号SAR影像超精细条带数据预处理实战:从原始数据到地理编码的完整操作指南
本文提供了高分三号SAR影像超精细条带数据预处理的完整实战指南。详细介绍了从原始数据导入、多视处理、滤波去噪、DEM准备到地理编码与辐射定标的完整流程,帮助用户利用SARscape软件将原始SAR数据转化为可用于分析的地理编码产品。
Quake源代碼分析(草稿).1
Quake是Id Software公司推出一款風迷全球的FPS遊戲.至今為止已經發展到了第三代,而且作為一個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的CS,它就是在Quake2引擎上改良而來的.雖然裡面的代碼實現並不完全相同,但是整體框架還是Quake2的,只要是稍微接觸過Quake引擎的人都很容易看得出來.(它是那麼的經典,以至於一直沿用到今天,個
IBM 3560M3 R5 坏盘更换记录
公司一台老旧 3650M3在日常巡查过程中发现硬盘报错
光模块的封装工艺有哪些?
COB封装传统的单路10Gb/s或25Gb/s速率的光模块采用SFP封装将电芯片和TO封装的光收发组件焊接到PCB板上组成光模块。但对于40G及以上速率的高速光模块,受激光器速率限制(多为25G),主要通过多通道并行实现,如40G由4×10G实现,而100G则由4×25G实现。蝶形封装:壳体通常为长方体,结构及实现功能通常比较复杂,可以内置制冷器、热沉、陶瓷基块、芯片、热敏电阻、背光监控,并且可以支持所有以上部件的键合引线。BOX封装属于蝶形封装的一种,用于多通道并行封装。
Quake源代碼分析(草稿).3
消息處理: 我把Quake的消息分為兩類,一種是常用輸入設備產生的消息,譬如KeyBoard,Mouse,JoyStick等. 另一種就是網絡或本地傳輸數據包時引發的消息. 引擎中Com_EventLoop()函數負責將抓獲到的消息根據事件的類型分發給對應的處理函數,Com_GetEvent()可以從com_eventQueue和eventqueue數組隊列
安装Codex时出现无法下载此应用和Microsoft Store初始化失败的解决方案
本文主要介绍了安装Codex时出现无法下载此应用和Microsoft Store初始化失败的解决方案,希望能对使用codex的同学们有所帮助。 文章目录 1. 问题描述 2. Windows 解决方案 3. Mac解决方案
Quake源代碼分析(草稿)
http://blog.csdn.net/breakpointer/archive/2004/09/30/121378.aspxQuake是Id Software公司推出一款風迷全球的FPS遊戲.至今為止已經發展到了第三代,而且作為一個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的CS,它就是在Quake2引擎上改良而來的.雖然裡面的代碼實現並不完全相同,但是整體
控制科学与工程(自动化)保研经验【4】——浙大篇
控制科学与工程(自动化)保研经验【4】——浙大篇
C# WinForm上位机:从串口调试工具到智能温控系统(Modbus RTU协议实战+完整源码)
做工业上位机开发时,我们常从串口调试工具入手:验证设备通信、查看数据帧,但面对实际场景(比如温控、电机控制),单纯的“收发数据”远远不够——需要解析工业标准协议(如Modbus RTU)、实时监控关键指标、实现自动化控制逻辑,还要有稳定的UI交互和数据记录。串口调试工具能收发数据,但看不懂Modbus RTU帧(地址、功能码、寄存器、CRC校验);想控制温控设备(如加热器、风扇),但不知道如何通过Modbus写入控制指令;手动调节目标温度时,温度波动大,需要PID算法实现精准控温,但不会集成;
Quake源代碼分析(草稿).2
在上一篇文章里,我談到過Quake的各個邏輯模塊被封裝在不同的DLL中,它們之間的交互利用了引出函數作為接口.這一點有點像COM,不同的是COM需要對DLL進行註冊,因為COM有時要提供給多個應用程序來使用,應用程序通過註冊表裡的GUID定位DLL,然後再載入到程序的進程空間中.但是Quake的DLL就不同了,它不必讓所有的應用程序都知道它的存在,它是專屬於引擎的,離開了引擎它一無
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
256



被折叠的 条评论
为什么被折叠?



