性能优化

This commit is contained in:
wuwenbo 2026-04-22 15:13:51 +08:00
parent c75002675b
commit ae83d2aa21
2 changed files with 92 additions and 41 deletions

View File

@ -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<byte> 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;
}
}
}
}
}
}

View File

@ -344,6 +344,11 @@ namespace RuntimeData
[MemoryPackIgnore] private HashSet<uint> _tmpOriginCityBuf;
[MemoryPackIgnore] private List<CityData> _tmpCityListBuf;
[MemoryPackIgnore] private HashSet<CityData> _tmpCitySetBuf;
[MemoryPackIgnore] private HashSet<uint> _tmpTerritoryGridIdBuf;
[MemoryPackIgnore] private HashSet<uint> _tmpTerritoryGridIdBuf2;
[MemoryPackIgnore] private List<GridData> _tmpTerritoryGridBuf;
[MemoryPackIgnore] private List<GridData> _tmpTerritoryGridBuf2;
[MemoryPackIgnore] private List<GridData> _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<uint>();
_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<uint>();
_tmpOriginCityBuf.Clear();
foreach (var player in map.PlayerMap.PlayerDataList)
{
_tmpOriginCityBuf.Add(player.CradleCityId);
}
var originCityHalfCount = _tmpOriginCityBuf.Count * 0.5f;
_tmpUnitSetBuf ??= new HashSet<UnitData>();
_tmpUnitSetBuf2 ??= new HashSet<UnitData>();
_tmpTerritoryGridIdBuf ??= new HashSet<uint>();
_tmpTerritoryGridIdBuf2 ??= new HashSet<uint>();
_tmpTerritoryGridBuf ??= new List<GridData>();
_tmpTerritoryGridBuf2 ??= new List<GridData>();
_tmpUnitGridBuf ??= new List<GridData>();
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;
}
}
}
}