diff --git a/Unity/Assets/Scripts/TH1_Data/NetData.cs b/Unity/Assets/Scripts/TH1_Data/NetData.cs index 75c042f6b..dfe7476db 100644 --- a/Unity/Assets/Scripts/TH1_Data/NetData.cs +++ b/Unity/Assets/Scripts/TH1_Data/NetData.cs @@ -6,8 +6,10 @@ */ +using System; using System.Buffers; using System.Collections.Generic; +using System.Runtime.InteropServices; using Logic.AI; using Logic.CrashSight; using MemoryPack; @@ -292,14 +294,32 @@ namespace RuntimeData public static string GetMapDataHash(MapData mapData) { - var actions = mapData.Net.Actions; - mapData.Net.Actions = null; - byte[] bytes = MemoryPackSerializer.Serialize(mapData); - mapData.Net.Actions = actions; - // 使用 Unity 的 Hash128(性能很好且稳定) - var hash128 = new Hash128(); - hash128.Append(bytes); - return hash128.ToString(); + lock (_bufferWriter) + { + var actions = mapData.Net.Actions; + mapData.Net.Actions = null; + try + { + _bufferWriter.Clear(); + MemoryPackSerializer.Serialize(_bufferWriter, mapData); + var hash128 = new Hash128(); + var writtenMemory = _bufferWriter.WrittenMemory; + if (MemoryMarshal.TryGetArray(writtenMemory, out ArraySegment segment) && segment.Array != null) + { + hash128.Append(segment.Array, segment.Offset, segment.Count); + } + else + { + hash128.Append(writtenMemory.ToArray()); + } + + return hash128.ToString(); + } + finally + { + mapData.Net.Actions = actions; + } + } } } -} \ No newline at end of file +} diff --git a/Unity/Assets/Scripts/TH1_Data/PlayerData.cs b/Unity/Assets/Scripts/TH1_Data/PlayerData.cs index 1bdb14c65..cd88f3626 100644 --- a/Unity/Assets/Scripts/TH1_Data/PlayerData.cs +++ b/Unity/Assets/Scripts/TH1_Data/PlayerData.cs @@ -344,6 +344,11 @@ namespace RuntimeData [MemoryPackIgnore] private HashSet _tmpOriginCityBuf; [MemoryPackIgnore] private List _tmpCityListBuf; [MemoryPackIgnore] private HashSet _tmpCitySetBuf; + [MemoryPackIgnore] private HashSet _tmpTerritoryGridIdBuf; + [MemoryPackIgnore] private HashSet _tmpTerritoryGridIdBuf2; + [MemoryPackIgnore] private List _tmpTerritoryGridBuf; + [MemoryPackIgnore] private List _tmpTerritoryGridBuf2; + [MemoryPackIgnore] private List _tmpUnitGridBuf; // 无参数初始化 [MemoryPackConstructor] @@ -656,27 +661,47 @@ namespace RuntimeData // 刷新对他国好感值 public void RefreshFeelingValue(MapData map) { + var playerDataList = map.PlayerMap.PlayerDataList; int maxScore = -1; uint maxScorePlayer = 0; - foreach (var player in map.PlayerMap.PlayerDataList) + _tmpOriginCityBuf ??= new HashSet(); + _tmpOriginCityBuf.Clear(); + foreach (var player in playerDataList) { + _tmpOriginCityBuf.Add(player.CradleCityId); if (!player.IsSurvival) continue; if (player.PlayerScore <= maxScore) continue; maxScore = player.PlayerScore; maxScorePlayer = player.Id; } - - _tmpOriginCityBuf ??= new HashSet(); - _tmpOriginCityBuf.Clear(); - foreach (var player in map.PlayerMap.PlayerDataList) - { - _tmpOriginCityBuf.Add(player.CradleCityId); - } + var originCityHalfCount = _tmpOriginCityBuf.Count * 0.5f; _tmpUnitSetBuf ??= new HashSet(); _tmpUnitSetBuf2 ??= new HashSet(); + _tmpTerritoryGridIdBuf ??= new HashSet(); + _tmpTerritoryGridIdBuf2 ??= new HashSet(); + _tmpTerritoryGridBuf ??= new List(); + _tmpTerritoryGridBuf2 ??= new List(); + _tmpUnitGridBuf ??= new List(); - foreach (var player in map.PlayerMap.PlayerDataList) + _tmpUnitSetBuf.Clear(); + map.GetUnitDataListByPlayerId(Id, _tmpUnitSetBuf); + var selfScore = 0f; + foreach (var unit in _tmpUnitSetBuf) selfScore += unit.GetMilitary(); + + _tmpTerritoryGridIdBuf.Clear(); + map.GetPlayerTerritoryGridIdSet(Id, _tmpTerritoryGridIdBuf); + _tmpTerritoryGridBuf.Clear(); + foreach (var gridId in _tmpTerritoryGridIdBuf) + { + if (!map.GridMap.GetGridDataByGid(gridId, out var gridData)) continue; + _tmpTerritoryGridBuf.Add(gridData); + } + + var aiDiff = map.MapConfig.AIDiff; + var selfIsAi = map.CheckIsAI(Id); + + foreach (var player in playerDataList) { if (!player.IsSurvival) continue; if (player.Id == Id) continue; @@ -688,7 +713,7 @@ namespace RuntimeData // 明智的 愚蠢的 var score1 = 0f; - foreach (var otherPlayer in map.PlayerMap.PlayerDataList) + foreach (var otherPlayer in playerDataList) { if (!player.IsSurvival) continue; if (otherPlayer.Id == Id || otherPlayer.Id == player.Id) continue; @@ -714,13 +739,13 @@ namespace RuntimeData } // 迷人的 恼人的 - if (map.MapConfig.AIDiff == AIDifficult.EASY && map.CheckIsRealPlayer(player.Id) && map.CheckIsAI(Id)) + if (aiDiff == AIDifficult.EASY && map.CheckIsRealPlayer(player.Id) && selfIsAi) { score += 15; selfToPlayer.FeelingStrategyList.Add(FeelingStrategy.Charming); } - if (map.MapConfig.AIDiff == AIDifficult.LUNATIC && map.CheckIsRealPlayer(player.Id) && map.CheckIsAI(Id)) + if (aiDiff == AIDifficult.LUNATIC && map.CheckIsRealPlayer(player.Id) && selfIsAi) { score -= 15; selfToPlayer.FeelingStrategyList.Add(FeelingStrategy.Annoying); @@ -746,14 +771,16 @@ namespace RuntimeData } // 强大的 弱小的 - var selfScore = 0f; var playerScore2 = 0f; - _tmpUnitSetBuf.Clear(); - map.GetUnitDataListByPlayerId(Id, _tmpUnitSetBuf); _tmpUnitSetBuf2.Clear(); map.GetUnitDataListByPlayerId(player.Id, _tmpUnitSetBuf2); - foreach (var unit in _tmpUnitSetBuf) selfScore += unit.GetMilitary(); - foreach (var unit in _tmpUnitSetBuf2) playerScore2 += unit.GetMilitary(); + _tmpUnitGridBuf.Clear(); + foreach (var unit in _tmpUnitSetBuf2) + { + playerScore2 += unit.GetMilitary(); + if (!map.GetGridDataByUnitId(unit.Id, out var unitGrid)) continue; + _tmpUnitGridBuf.Add(unitGrid); + } if (selfScore < playerScore2) { score += 15; @@ -777,39 +804,43 @@ namespace RuntimeData } // 威胁的 - _tmpUnitSetBuf2.Clear(); - map.GetUnitDataListByPlayerId(player.Id, _tmpUnitSetBuf2); - var selfTerritory = map.GetPlayerTerritoryGridIdSet(Id); - foreach (var gridId in selfTerritory) + var hasThreatening = false; + foreach (var gridData in _tmpTerritoryGridBuf) { - if (!map.GridMap.GetGridDataByGid(gridId, out var gridData)) continue; - foreach (var unit in _tmpUnitSetBuf2) + foreach (var unitGrid in _tmpUnitGridBuf) { - if (!map.GetGridDataByUnitId(unit.Id, out var unitGrid)) continue; var dis = map.GridMap.CalcDistance(unitGrid, gridData); if (dis > 1) continue; score -= 15; selfToPlayer.FeelingStrategyList.Add(FeelingStrategy.Threatening); + hasThreatening = true; break; } - if (selfToPlayer.FeelingStrategyList.Contains(FeelingStrategy.Threatening)) break; + if (hasThreatening) break; } // 侵略的 - var playerTerritory = map.GetPlayerTerritoryGridIdSet(player.Id); - foreach (var playerGridId in playerTerritory) + _tmpTerritoryGridIdBuf2.Clear(); + map.GetPlayerTerritoryGridIdSet(player.Id, _tmpTerritoryGridIdBuf2); + _tmpTerritoryGridBuf2.Clear(); + foreach (var playerGridId in _tmpTerritoryGridIdBuf2) { if (!map.GridMap.GetGridDataByGid(playerGridId, out var playerGrid)) continue; - foreach (var selfGridId in selfTerritory) + _tmpTerritoryGridBuf2.Add(playerGrid); + } + var hasIntrusive = false; + foreach (var playerGrid in _tmpTerritoryGridBuf2) + { + foreach (var selfGrid in _tmpTerritoryGridBuf) { - if (!map.GridMap.GetGridDataByGid(selfGridId, out var selfGrid)) continue; var dis = map.GridMap.CalcDistance(playerGrid, selfGrid); if (dis > 1) continue; score -= 15; selfToPlayer.FeelingStrategyList.Add(FeelingStrategy.Intrusive); + hasIntrusive = true; break; } - if (selfToPlayer.FeelingStrategyList.Contains(FeelingStrategy.Intrusive)) break; + if (hasIntrusive) break; } // 主宰的 @@ -824,7 +855,7 @@ namespace RuntimeData if (_tmpOriginCityBuf.Contains(city.Id)) count++; } - if (count >= _tmpOriginCityBuf.Count * 0.5f) + if (count >= originCityHalfCount) { score -= 15; selfToPlayer.FeelingStrategyList.Add(FeelingStrategy.Dominative); @@ -1824,4 +1855,4 @@ namespace RuntimeData PlayerCulture += 5; } } -} \ No newline at end of file +}