性能优化
This commit is contained in:
parent
c75002675b
commit
ae83d2aa21
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user