Quake3 code review Network Supporting tagline
Client
###客户端和服务端的沟通流程?
CL_SendCmd
CL_WritePacket
CL_Netchan_Transmit
Netchan_Transmit
NET_SendPacket // 装包, 添加包头等
Sys_SendPacket // 调用系统 socket, 发送
客户端怎么解析所有玩家的信息?
CL_ParseServerMessage()
{
switch(cmd)
{
case svc_serverCommand:
CL_ParseCommandString( msg );
break;
case svc_gamestate:
CL_ParseGamestate( msg );
break;
case svc_snapshot:
CL_ParseSnapshot( msg );
break;
}
}
Server
###怎么分发所有玩家的 game state?
SV_SendQueuedMessages()
{
for(i=0; i < clients.count; i++)
{
SV_Netchan_TransmitNextFragment()
{
SV_Netchan_TransmitNextInQueue()
{
Netchan_Transmit()
{
NET_SendPacket()
{
// 如果只有一个玩家,直接发送
Sys_SendPacket()
// 如果多个玩家,把所有 clients.data 塞到一个队列里
NET_QueuePacket()
{
}
}
}
}
}
}
}
common.c 中调用:
NET_FlushPacketQueue()
{
// 传送队列中的所有 data
while(packetQueue) {
Sys_SendPacket(packetQueue->length, packetQueue->data,
packetQueue->to);
last = packetQueue;
packetQueue = packetQueue->next;
Z_Free(last->data);
Z_Free(last);
}
}
怎么处理所有玩家在地图中的位置?
Published
27 September 2013