Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions Soccer/Knowledge/Knowledge.Defense.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ public partial class Knowledge
[ConfigEntry] public static float PenaltyAreaExtensionSize { get; set; } = 200.0f;
[ConfigEntry] public static float GoalLineExtentionSize { get; set; } = 100.0f;

private Common.Data.Ssl.Gc.Command? _lastRefCommand;
private Common.Time.Timestamp _oppRestartTimestamp;

public bool GoalieDiveAllowed { get; private set; }
public bool BallIsGoaling { get; private set; }
public float BallOwnGoalReachTime { get; private set; }
Expand Down
5 changes: 4 additions & 1 deletion Soccer/Plays/OurFreekick.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ public Formation Tick()

var zones = Context.Knowledge.SortedZonesByOffense;
var bestOffenseZone = zones.Count > 0 ? zones.Peek() : null;
Draw.DrawCircle(bestOffenseZone.BestPosOffence, 200, Color.Amber, Options.Outline());
if (bestOffenseZone != null)
{
Draw.DrawCircle(bestOffenseZone.BestPosOffence, 200, Color.Amber, Options.Outline());
}
var chipperTarget = bestOffenseZone?.BestPosOffence ?? Context.Field.OppGoal();
var chipPower = 0;

Expand Down
25 changes: 13 additions & 12 deletions Soccer/Tactics/BallPlacement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ public BallPlacement(Robot.Robot robot, int placerId)
var finalBallPos = Context.Referee.DesignatedPosition();
var ballPlacer1 = GetPlacer(1);
var ballPlacer2 = GetPlacer(2);
if (ballPlacer1 == null || ballPlacer2 == null) return false;
var middle = (ballPlacer1.Position + ballPlacer2.Position) / 2.0f;
return Vector2.Distance(middle, finalBallPos) < 100f;
}, BPStateDelay);
Expand Down Expand Up @@ -311,28 +312,28 @@ public void Exit()
var ballPlacer1 = GetPlacer(1);
var ballPlacer2 = GetPlacer(2);

var direction = Vector2.Normalize((ballPlacer1.Position + ballPlacer2.Position) / 2.0f - finalBallPos);

if (ballPlacer1 != null && ballPlacer2 != null)
{
//var direction = Vector2.Normalize((ballPlacer1.Position + ballPlacer2.Position) / 2.0f - finalBallPos);
var direction = Vector2.Normalize((ballPlacer1.Position + ballPlacer2.Position) / 2.0f - finalBallPos);
tactic._ballPlacer2FinalPos = finalBallPos +
direction *
BPKissInitDistance;
tactic._ballPlacer1FinalPos = finalBallPos -
direction *
BPKissInitDistance;

var kissTouch2 = finalBallPos + direction * 75f;
var kissTouch1 = finalBallPos - direction * 75f;

return new GoToPoint
{
Target = tactic.PlacerId == 1 ? kissTouch1 : kissTouch2,
VelocityProfile = VelocityProfile.Sooski,
NavigationFlags = NavigationFlags.NoObstacles | NavigationFlags.NoBallObstacle
};
}

//var axis = Vector2.Normalize((ballPlacer1?.Position ?? tactic.Robot.Position) - finalBallPos);
var kissTouch2 = finalBallPos + direction * 75f;
var kissTouch1 = finalBallPos - direction * 75f;
return new GoToPoint
{
Target = tactic.PlacerId == 1 ? kissTouch1 : kissTouch2,
VelocityProfile = VelocityProfile.Sooski,
NavigationFlags = NavigationFlags.NoObstacles | NavigationFlags.NoBallObstacle
};
return null;
}
}

Expand Down
4 changes: 2 additions & 2 deletions SourceGen/SourceGen.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="5.3.0">
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0-beta1.24629.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="5.3.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.12.0" />
</ItemGroup>

</Project>
12 changes: 6 additions & 6 deletions Tests/Soccer/Plays/OurKickoffTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public void OurKickoff_ReturnsCorrectFormation()

// Assert
Assert.Equal(4, formation.RequiredRoles.Count);
Assert.Equal(3, formation.DesiredRoles.Count);
Assert.Equal(4, formation.DesiredRoles.Count);

Assert.Contains(formation.RequiredRoles, r => r is Goalie);
Assert.Contains(formation.RequiredRoles, r => r is Defender { DefId: 1 });
Expand All @@ -58,15 +58,15 @@ public void OurKickoff_ReturnsCorrectFormation()

var attacker = (CircleBall)formation.RequiredRoles.First(r => r is CircleBall);
// side = -Context.SideSign. Left is -1, so side = 1.
// mid5Pos = (0 + 1 * 150, 3000 - 300) = (150, 2700)
Assert.Equal(new Vector2(150f, 2700f), attacker.TargetPosition);
// mid5Pos = (0 - 1 * 150, 3000 - 300) = (-150, 2700)
Assert.Equal(new Vector2(-150f, 2700f), attacker.TargetPosition);
Assert.Equal(0f, attacker.ShootPower);

var mid5 = (Waiter)formation.DesiredRoles[0];
Assert.Equal(new Vector2(150f, 2700f), mid5.Target);
Assert.Equal(new Vector2(-150f, 2700f), mid5.Target);

var mid1 = (Waiter)formation.DesiredRoles[1];
Assert.Equal(new Vector2(150f, -2700f), mid1.Target);
Assert.Equal(new Vector2(-150f, -2700f), mid1.Target);

var mid2 = (Waiter)formation.DesiredRoles[2];
// mid2Pos = ballPos.PointOnConnectingLine(OwnGoal, 1000f)
Expand Down Expand Up @@ -114,6 +114,6 @@ public void OurKickoff_KicksAfterTwoSeconds()

// Assert
var attacker = (CircleBall)formation.RequiredRoles.First(r => r is CircleBall);
Assert.Equal(5000f, attacker.ShootPower);
Assert.Equal(3000f, attacker.ShootPower);
}
}
4 changes: 2 additions & 2 deletions Tests/Soccer/Plays/StatefulPlayTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public void NormalPlay_DefendingState_UsesDefensiveAttackerAndMarking()
var opponent = CreateOpponent(1, new Vector2(-2500f, 0f));
var knowledge = SetupContext(
gameState: GameState.Running,
ballPosition: Vector2.Zero,
ballPosition: new Vector2(-1000f, 0f),
ownRobots: ownRobots,
oppRobots: [opponent]);

Expand Down Expand Up @@ -81,7 +81,7 @@ public void Stop_DefendingState_UsesMarking()
var opponent = CreateOpponent(1, new Vector2(-2500f, 200f));
var knowledge = SetupContext(
gameState: GameState.Stop,
ballPosition: Vector2.Zero,
ballPosition: new Vector2(-1000f, 0f),
ownRobots: ownRobots,
oppRobots: [opponent]);

Expand Down
31 changes: 25 additions & 6 deletions Vision/Tracking/RobotMerger.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Numerics;
using Tyr.Common.Config;
using Tyr.Common.Data.Ssl;
using Tyr.Common.Data;
using Tyr.Common.Math;
using Tyr.Common.Vision.Data;

Expand All @@ -13,17 +14,35 @@ public partial class RobotMerger
"Factor to weight stdDeviation during tracker merging, reasonable range: 1.0 - 2.0. High values lead to more jitter")]
private static float MergePower { get; set; } = 1.5f;

// Bolt: eliminates ~15 allocs/frame (LINQ SelectMany/GroupBy/ToDictionary + enumerators) — using class-level dictionary and manual loops
// To verify: dotnet-counters monitor --counters System.Runtime[gen-0-gc-count,alloc-rate] -p <pid>
private readonly Dictionary<RobotId, List<RobotTracker>> _trackersById = new(CommonConfigs.MaxRobots * 2);

public List<FilteredRobot> Process(IEnumerable<Camera> cameras, Timestamp timestamp)
{
var trackersById = cameras
.SelectMany(camera => camera.Robots.Values)
.GroupBy(robot => robot.Id)
.ToDictionary(grouping => grouping.Key, grouping => grouping.ToList());
foreach (var list in _trackersById.Values)
{
list.Clear();
}

foreach (var camera in cameras)
{
foreach (var robot in camera.Robots.Values)
{
if (!_trackersById.TryGetValue(robot.Id, out var trackers))
{
trackers = new List<RobotTracker>(4);
_trackersById[robot.Id] = trackers;
}
trackers.Add(robot);
}
}

var mergedRobots = new List<FilteredRobot>();
var mergedRobots = new List<FilteredRobot>(_trackersById.Count);

foreach (var (id, trackers) in trackersById)
foreach (var (id, trackers) in _trackersById)
{
if (trackers.Count == 0) continue;
mergedRobots.Add(Merge(id, trackers, timestamp));
}

Expand Down
Loading