public void Update(out bool _mWin, out bool _oWin) { MemoryStream mMs = null; MemoryStream oMs = null; BinaryWriter mBw = null; BinaryWriter oBw = null; if (!isClient) { mMs = new MemoryStream(); mBw = new BinaryWriter(mMs); oMs = new MemoryStream(); oBw = new BinaryWriter(oMs); ServerUpdate(mBw, true); ServerUpdate(oBw, false); } //do command if (commandPool.ContainsKey(roundNum)) { Dictionary <int, CommandData> tmpDic = commandPool[roundNum]; Dictionary <int, CommandData> .ValueCollection.Enumerator enumerator = tmpDic.Values.GetEnumerator(); while (enumerator.MoveNext()) { DoCommand(enumerator.Current); } commandPool.Remove(roundNum); } //服务器必须在波次到来前N帧将新增单位指令添加到pool中 if (!isClient && (roundNum + gameConfig.GetCommandDelay()) % gameConfig.GetSpawnStep() == 0) { Dictionary <int, Dictionary <int, UnitCommandData> > .ValueCollection.Enumerator enumerator = mUnitCommandPool.Values.GetEnumerator(); while (enumerator.MoveNext()) { Dictionary <int, UnitCommandData> tmpDic = enumerator.Current; Dictionary <int, UnitCommandData> .ValueCollection.Enumerator enumerator2 = tmpDic.Values.GetEnumerator(); while (enumerator2.MoveNext()) { DoCommand(enumerator2.Current); } } mUnitCommandPool.Clear(); enumerator = oUnitCommandPool.Values.GetEnumerator(); while (enumerator.MoveNext()) { Dictionary <int, UnitCommandData> tmpDic = enumerator.Current; Dictionary <int, UnitCommandData> .ValueCollection.Enumerator enumerator2 = tmpDic.Values.GetEnumerator(); while (enumerator2.MoveNext()) { DoCommand(enumerator2.Current); } } oUnitCommandPool.Clear(); } //客户端必须在波次到来的这一帧将新增单位指令添加到pool中 同时还要将下一个波次的新增单位指令继续保存 else if (isClient && roundNum % gameConfig.GetSpawnStep() == 0) { Dictionary <int, Dictionary <int, UnitCommandData> > newDic = null; Dictionary <int, Dictionary <int, UnitCommandData> > .Enumerator enumerator = mUnitCommandPool.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Current.Key > roundNum) { if (newDic == null) { newDic = new Dictionary <int, Dictionary <int, UnitCommandData> >(); } newDic.Add(enumerator.Current.Key, enumerator.Current.Value); } else { Dictionary <int, UnitCommandData> tmpDic = enumerator.Current.Value; Dictionary <int, UnitCommandData> .ValueCollection.Enumerator enumerator2 = tmpDic.Values.GetEnumerator(); while (enumerator2.MoveNext()) { DoCommand(enumerator2.Current); } } } if (newDic != null) { mUnitCommandPool = newDic; newDic = null; } else { mUnitCommandPool.Clear(); } enumerator = oUnitCommandPool.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Current.Key > roundNum) { if (newDic == null) { newDic = new Dictionary <int, Dictionary <int, UnitCommandData> >(); } newDic.Add(enumerator.Current.Key, enumerator.Current.Value); } else { Dictionary <int, UnitCommandData> tmpDic = enumerator.Current.Value; Dictionary <int, UnitCommandData> .ValueCollection.Enumerator enumerator2 = tmpDic.Values.GetEnumerator(); while (enumerator2.MoveNext()) { DoCommand(enumerator2.Current); } } } if (newDic != null) { oUnitCommandPool = newDic; } else { oUnitCommandPool.Clear(); } } //---- //do round action if (roundNum % gameConfig.GetSpawnStep() == 0) { Spawn(); } simulator.BuildAgentTree(); UpdateSkill();//use tree _mWin = false; _oWin = false; Dictionary <int, LinkedList <int> > clientAttackData = null; UpdateUnit(ref _mWin, ref _oWin, ref clientAttackData); //use tree CheckSkillEnd(); //destroy tree for (int i = 0; i < gameConfig.GetMoveTimes() - 1; i++) { simulator.BuildAgentTree(); simulator.doStep(); } simulator.BuildAgentTree(); double result = simulator.doStepFinal(); Log.Write("round:" + roundNum + "------------------\n"); var tt = unitList.GetEnumerator(); while (tt.MoveNext()) { Log.Write("uid:" + tt.Current.uid + " hp:" + tt.Current.nowHp + " x:" + tt.Current.pos.x + " y:" + tt.Current.pos.y + "\n"); } //---- mMoney += gameConfig.GetMoneyPerStep(); oMoney += gameConfig.GetMoneyPerStep(); if (isClient) { if (resultDic.ContainsKey(roundNum)) { double serverResult = resultDic[roundNum]; if (result.ToString("F4") != serverResult.ToString("F4")) { throw new Exception("我就日了 myRound:" + roundNum + " serverRound:" + serverRoundNum + " myResult:" + result + " serverResult:" + serverResult); } else { resultDic.Remove(roundNum); } } else { resultDic.Add(roundNum, result); } updateCallBack(clientAttackData); } else { mBw.Write(result); oBw.Write(result); serverSendDataCallBack(true, mMs); serverSendDataCallBack(false, oMs); mMs.Dispose(); mBw.Close(); oMs.Dispose(); oBw.Close(); mShowMoney += gameConfig.GetMoneyPerStep(); oShowMoney += gameConfig.GetMoneyPerStep(); } if (!isClient && (_mWin || _oWin)) { Over(); using (MemoryStream ms = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(ms)) { bw.Write((int)S2CCommand.BATTLE_OVER); bw.Write(roundNum); bw.Write(_mWin); bw.Write(_oWin); serverSendDataCallBack(true, ms); serverSendDataCallBack(false, ms); } } } else { roundNum++; } }