private void OnFrameBC(GM_Frame_BC recvData) { if (GameApplication.GetSingleton().mode == Mode.LockStep) { OnLockStepFrameBC(recvData); } else { OnOptimisticFrameBC(recvData); } }
private void OnLockStepFrameBC(GM_Frame_BC recvData) { if (recvData == null) { return; } //不打印那么多信息 if (recvData.command.Count > 0 || recvData.frame % 30 == 0) { Debug.Log("Receive frame:" + recvData.frame + " command:" + recvData.command.Count); } long frame = recvData.frame; mFrameTime = recvData.frametime; if (frame == mCurrentFrame) { recvData.command.Sort(SortCommand); for (int i = 0; i < recvData.command.Count; ++i) { GMCommand cmd = recvData.command[i]; Command data = new Command(cmd.id, cmd.frame, cmd.type, cmd.data, cmd.frametime); if (mFrameDic.ContainsKey(frame) == false) { mFrameDic.Add(frame, new List <Command>()); } mFrameDic[frame].Add(data); DoCommand(data); } EventDispatch.Dispatch(EventID.Frame_Broadcast, mCurrentFrame); mCurrentFrame++; } else { Debug.LogError("frame = " + frame + ",current=" + mCurrentFrame); } }
/// <summary> /// 按固定频率向客户端广播帧 /// </summary> private void SendFrame() { long frame = mCurrentFrame++; int userCount = 0; //当前帧有多少个客户端发了命令 GM_Frame_BC sendData = new GM_Frame_BC(); sendData.frame = frame; sendData.frametime = mFrameTime; if (mFrameDic.ContainsKey(frame)) { var frames = mFrameDic[frame]; userCount = frames.Count; var it = frames.GetEnumerator(); while (it.MoveNext()) { for (int i = 0, count = it.Current.Value.Count; i < count; ++i) { GMCommand cmd = ProtoTransfer.Get(it.Current.Value[i]); cmd.eventType = it.Current.Value[i].eventType; sendData.command.Add(cmd); } } } //不显示那么多log if (frame % 30 == 0 || sendData.command.Count > 0) { Debug.Log(string.Format("Send frame:{0} user count:{1} command count:{2}", frame, userCount, sendData.command.Count), ConsoleColor.Gray); } BroadCast(MessageID.GM_FRAME_BC, sendData, true); }
/// <summary> /// 乐观模式处理 /// </summary> /// <param name="recvData"></param> private void OnOptimisticFrameBC(GM_Frame_BC recvData) { if (recvData == null) { return; } mCurrentFrame = recvData.frame; //不打印那么多信息 if (recvData.command.Count > 0 || recvData.frame % 30 == 0) { Debug.Log("Receive frame:" + recvData.frame + " command:" + recvData.command.Count); Debug.Log(recvData.frametime + "," + mFrameTime + "," + (mFrameTime - recvData.frametime)); } mFrameTime = recvData.frametime; for (int i = 0; i < recvData.command.Count; ++i) { GMCommand cmd = recvData.command[i]; Command data = new Command(cmd.id, cmd.frame, cmd.type, cmd.data, cmd.frametime); if (mFrameDic.ContainsKey(mCurrentFrame) == false) { mFrameDic.Add(mCurrentFrame, new List <Command>()); } mFrameDic[mCurrentFrame].Add(data); DoCommand(data); } EventDispatch.Dispatch(EventID.Frame_Broadcast, mCurrentFrame); }
private void OnLockStepFrame(Session client, GM_Frame recvData) { long frame = recvData.frame; int roleId = recvData.roleId; if (recvData.command.Count > 0 || frame % 30 == 0) { Debug.Log(string.Format("Receive {0} serverframe:{1} clientframe:{2} command:{3}", roleId, mCurrentFrame, frame, recvData.command.Count), ConsoleColor.DarkGray); } if (mFrameDic.ContainsKey(frame) == false) { mFrameDic.Add(frame, new Dictionary <int, List <Command> >()); } var frames = mFrameDic[frame]; //当前帧的服务器命令 if (frames.ContainsKey(SERVER_ROLEID) == false) { frames.Add(SERVER_ROLEID, new List <Command>()); } //该玩家是否发送了当前帧 if (frames.ContainsKey(roleId) == false) { frames.Add(roleId, new List <Command>()); } for (int i = 0; i < recvData.command.Count; ++i) { Command cmd = new Command(recvData.command[i].frame, recvData.command[i].type, recvData.command[i].data, recvData.command[i].frametime); frames[roleId].Add(cmd); } //当所有玩家都发送了该帧,就可以广播了 //减去1是因为服务器命令也在当前帧中 if (frames.Count - 1 >= mUserList.Count) { GM_Frame_BC sendData = new GM_Frame_BC(); sendData.frame = frame; sendData.frametime = mFrameTime; var it = frames.GetEnumerator(); while (it.MoveNext()) { for (int i = 0, count = it.Current.Value.Count; i < count; ++i) { GMCommand cmd = ProtoTransfer.Get(it.Current.Value[i]); sendData.command.Add(cmd); } } BroadCast(MessageID.GM_FRAME_BC, sendData, true); mCurrentFrame = frame + 1; } else { Debug.Log(string.Format("Waiting {0} frame:{1} count:{2} current:{3} ", roleId, frame, mFrameDic[frame].Count, mUserList.Count), ConsoleColor.Red); } }