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