Skip to content

Commit fe0e4c1

Browse files
Refactor SceneComposition O(n) -> O(1) Lookup Time
1 parent 3f64bab commit fe0e4c1

13 files changed

Lines changed: 77 additions & 188 deletions

File tree

Template/Framework/Composition/SceneComposition.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,40 @@ public static T InstantiateAndConfigure<T>(PackedScene scene, GameServices servi
1616
ArgumentNullException.ThrowIfNull(services);
1717

1818
T node = scene.Instantiate<T>();
19-
ConfigureNodeTree(node, services);
19+
ConfigureNode(node, services);
2020
return node;
2121
}
2222

2323
public static void ConfigureNodeTree(Node root, GameServices services)
2424
{
25-
if (root is ISceneDependencyReceiver receiver)
25+
ConfigureNode(root, services);
26+
}
27+
28+
public static void ConfigureNode(Node node, GameServices services)
29+
{
30+
ArgumentNullException.ThrowIfNull(node);
31+
ArgumentNullException.ThrowIfNull(services);
32+
33+
if (node is ISceneDependencyReceiver receiver)
2634
{
2735
receiver.Configure(services);
2836
}
37+
}
38+
39+
public static void ConfigureNodeFromGame(Node node)
40+
{
41+
ArgumentNullException.ThrowIfNull(node);
42+
43+
if (node is not ISceneDependencyReceiver receiver)
44+
{
45+
return;
46+
}
2947

30-
foreach (Node child in root.GetChildren())
48+
if (!Game.TryGetServices(out GameServices services))
3149
{
32-
ConfigureNodeTree(child, services);
50+
return;
3351
}
52+
53+
receiver.Configure(services);
3454
}
3555
}

Template/Framework/Console/GameConsole.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ public void Configure(GameServices services)
3434

3535
public bool Visible => _mainContainer.Visible;
3636

37+
public override void _EnterTree()
38+
{
39+
SceneComposition.ConfigureNodeFromGame(this);
40+
}
41+
3742
public override void _Ready()
3843
{
3944
if (!_isConfigured)

Template/Framework/Debugging/GameFramework.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@ internal static void Initialize(GameServices services)
1717
_services = services;
1818
}
1919

20+
internal static bool TryGetServices(out GameServices services)
21+
{
22+
if (_services is null)
23+
{
24+
services = null!;
25+
return false;
26+
}
27+
28+
services = _services;
29+
return true;
30+
}
31+
2032
internal static void Reset()
2133
{
2234
_services = null;

Template/Framework/ModLoader/ModLoader.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ public void Configure(GameServices services)
3333
_isConfigured = true;
3434
}
3535

36+
public override void _EnterTree()
37+
{
38+
SceneComposition.ConfigureNodeFromGame(this);
39+
}
40+
3641
// Godot Overrides
3742
public override void _Ready()
3843
{

Template/Framework/Netcode/Examples/TopDown2/World.cs

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,17 @@
11
using Godot;
2-
using System;
32

43
namespace __TEMPLATE__.Netcode.Examples.TopDown2;
54

6-
public partial class World : Node, ISceneDependencyReceiver
5+
public partial class World : Node
76
{
87
private const int Port = 25565;
98
private const string Ip = "127.0.0.1";
109

1110
private Net<GameClient, GameServer> _net = null!;
12-
private ILoggerService _loggerService = null!;
13-
private IApplicationLifetime _applicationLifetime = null!;
14-
private bool _isConfigured;
15-
16-
public void Configure(GameServices services)
17-
{
18-
_loggerService = services.Logger;
19-
_applicationLifetime = services.ApplicationLifetime;
20-
_isConfigured = true;
21-
}
2211

2312
public override void _Ready()
2413
{
25-
if (!_isConfigured)
26-
throw new InvalidOperationException($"{nameof(World)} was not configured before _Ready.");
27-
28-
_net = new Net<GameClient, GameServer>(_loggerService, _applicationLifetime);
14+
_net = new Net<GameClient, GameServer>(Game.Logger, Game.Application);
2915
_net.StartServer(Port);
3016
_net.StartClient(Ip, Port);
3117
}

Template/Framework/Netcode/NetControlPanelLow.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ public void Configure(GameServices services)
4141
_isConfigured = true;
4242
}
4343

44+
public override void _EnterTree()
45+
{
46+
SceneComposition.ConfigureNodeFromGame(this);
47+
}
48+
4449
public override void _Ready()
4550
{
4651
if (!_isConfigured)

Template/Framework/Scenes/MainMenuNavFramework.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public void Configure(GameServices services)
2626
_isConfigured = true;
2727
}
2828

29+
public override void _EnterTree()
30+
{
31+
SceneComposition.ConfigureNodeFromGame(this);
32+
}
33+
2934
// Godot Overrides
3035
public override void _Ready()
3136
{

Template/Framework/Scenes/MenuUI/Credits/Credits.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ public void Configure(GameServices services)
4343
_isConfigured = true;
4444
}
4545

46+
public override void _EnterTree()
47+
{
48+
SceneComposition.ConfigureNodeFromGame(this);
49+
}
50+
4651
// Godot Overrides
4752
public override void _Ready()
4853
{

Template/Framework/Scenes/Options/Options.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ public void Configure(OptionsManager optionsManager, SceneManager sceneManager,
3939
_isConfigured = true;
4040
}
4141

42+
public override void _EnterTree()
43+
{
44+
SceneComposition.ConfigureNodeFromGame(this);
45+
}
46+
4247
// Godot Overrides
4348
public override void _Ready()
4449
{

Template/Framework/Scenes/PopupMenu/PopupMenu.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ public void Configure(GameServices services)
5252
_isConfigured = true;
5353
}
5454

55+
public override void _EnterTree()
56+
{
57+
SceneComposition.ConfigureNodeFromGame(this);
58+
}
59+
5560
// Godot Overrides
5661
public override void _Ready()
5762
{

0 commit comments

Comments
 (0)