Merge pull request #9400 from reaperrr/fix-airefplaceperf
Fixed massive AI base builder performance issue
This commit is contained in:
@@ -74,6 +74,9 @@ namespace OpenRA.Mods.Common.AI
|
|||||||
"for StructureProductionResumeDelay before retrying.")]
|
"for StructureProductionResumeDelay before retrying.")]
|
||||||
public readonly int MaximumFailedPlacementAttempts = 3;
|
public readonly int MaximumFailedPlacementAttempts = 3;
|
||||||
|
|
||||||
|
[Desc("How many randomly chosen cells with resources to check when deciding refinery placement.")]
|
||||||
|
public readonly int MaxResourceCellsToCheck = 3;
|
||||||
|
|
||||||
[Desc("Delay (in ticks) until rechecking for new BaseProviders.")]
|
[Desc("Delay (in ticks) until rechecking for new BaseProviders.")]
|
||||||
public readonly int CheckForNewBasesDelay = 1500;
|
public readonly int CheckForNewBasesDelay = 1500;
|
||||||
|
|
||||||
@@ -98,6 +101,9 @@ namespace OpenRA.Mods.Common.AI
|
|||||||
[Desc("Radius in cells around a factory scanned for rally points by the AI.")]
|
[Desc("Radius in cells around a factory scanned for rally points by the AI.")]
|
||||||
public readonly int RallyPointScanRadius = 8;
|
public readonly int RallyPointScanRadius = 8;
|
||||||
|
|
||||||
|
[Desc("Minimum distance in cells from center of the base when checking for building placement.")]
|
||||||
|
public readonly int MinBaseRadius = 2;
|
||||||
|
|
||||||
[Desc("Radius in cells around the center of the base to expand.")]
|
[Desc("Radius in cells around the center of the base to expand.")]
|
||||||
public readonly int MaxBaseRadius = 20;
|
public readonly int MaxBaseRadius = 20;
|
||||||
|
|
||||||
@@ -500,22 +506,22 @@ namespace OpenRA.Mods.Common.AI
|
|||||||
case BuildingType.Refinery:
|
case BuildingType.Refinery:
|
||||||
|
|
||||||
// Try and place the refinery near a resource field
|
// Try and place the refinery near a resource field
|
||||||
var nearbyResources = Map.FindTilesInCircle(baseCenter, Info.MaxBaseRadius)
|
var nearbyResources = Map.FindTilesInAnnulus(baseCenter, Info.MinBaseRadius, Info.MaxBaseRadius)
|
||||||
.Where(a => resourceTypeIndices.Get(Map.GetTerrainIndex(a)))
|
.Where(a => resourceTypeIndices.Get(Map.GetTerrainIndex(a)))
|
||||||
.Shuffle(Random);
|
.Shuffle(Random).Take(Info.MaxResourceCellsToCheck);
|
||||||
|
|
||||||
foreach (var c in nearbyResources)
|
foreach (var r in nearbyResources)
|
||||||
{
|
{
|
||||||
var found = findPos(c, baseCenter, 0, Info.MaxBaseRadius);
|
var found = findPos(r, baseCenter, Info.MinBaseRadius, Info.MaxBaseRadius);
|
||||||
if (found != null)
|
if (found != null)
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try and find a free spot somewhere else in the base
|
// Try and find a free spot somewhere else in the base
|
||||||
return findPos(baseCenter, baseCenter, 0, Info.MaxBaseRadius);
|
return findPos(baseCenter, baseCenter, Info.MinBaseRadius, Info.MaxBaseRadius);
|
||||||
|
|
||||||
case BuildingType.Building:
|
case BuildingType.Building:
|
||||||
return findPos(baseCenter, baseCenter, 0, distanceToBaseIsImportant ? Info.MaxBaseRadius : Map.MaxTilesInCircleRange);
|
return findPos(baseCenter, baseCenter, Info.MinBaseRadius, distanceToBaseIsImportant ? Info.MaxBaseRadius : Map.MaxTilesInCircleRange);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Can't find a build location
|
// Can't find a build location
|
||||||
|
|||||||
Reference in New Issue
Block a user