Autofac in Godot-Spielen?

alinnert

Mitglied
Hallo zusammen,

ich frag das mal hier statt in Game-Development, weil es mir mehr um Autofac geht. Ich teste gerade Godot im Zusammenhang mit C#, was erstmal erschreckend smooth läuft. Ich bin jetzt dabei herauszufinden, wie ich ein potentielles Projekt strukturieren würde und versuch mich gerade an Autofac (DI/IoC Container), um Funktionen von Objekten in eigene Klassen auszulagern. Grundsätzlich funktioniert das, mir stellt sich nur eine Frage.

Normalerweise injiziert man seine Dependencies ja über Konstruktoren und deren Parameter. Das geht in meinem Fall nicht, weil diese in Godot keine Parameter annehmen dürfen, sonst kann das Spiel nicht kompiliert werden. Also weiche ich auf die Möglichkeit aus, auf meine Dependencies imperativ zuzugreifen:

C#:
// Lifetime Scope meines DI-Containers erzeugen
using(var scope = Main.Container.BeginLifetimeScope()) {
  // Aus diesem Scope den `ControllerInputService` holen
  var inputService = scope.Resolve<ControllerInputService>();
  // Und dann Zeug damit machen
  var movement = inputService.InputVector * delta * 5000;
  MoveAndSlide(movement);
}

Main ist die Hauptklasse. Diese existiert nur einmal für die komplette Lebensdauer des Spiels, bis es beendet wird. Darin speicher ich in Container den Dependency Container.

Der Codeschnipsel oben liegt dann z. B. in irgendeiner Klasse, die auf eine Dependency zugreifen will (Hier die Player-Klasse). Das passiert aber in der _Process-Methode. Heißt: je nach Bildschirm z. B. 60 mal, 120 mal oder öfter pro Sekunde. Das heißt auch, dass die Scopes jeweils super-kurzlebig sind.

Jetzt meine Frage: Ist diese Methode (i. S. v. Herangehensweise) dafür ausgelegt oder gibt es da später schneller Performanceprobleme? Gibt es da ggf. bessere Möglichkeiten, auf seine Dependencies zuzugreifen? Oder soll ich doch lieber Godot-näher bleiben und auf DI-Container verzichten?

Mein Bewege-Ein-Bild-mit-Pfeiltasten-über-den-Bildschirm-Hello-World-Programm läuft durchgehend mit 120 FPS, aber das tut halt auch noch nix produktives.
 

Rushh0ur

Neues Mitglied
Ich würde solche Referenzauflösungen nicht in der zyklischen _Process Methode ausführen. Auch wenn C# relativ Performant ist sollte man sein Glück nicht herausfordern; zumal man dann auch schnell zig Implementierungen in Autofac registrieren kann.

Alle nötigen Referenz würde ich in der Parent Scene/Node in der _Ready Methode auflösen und lokal Speichern. Dann kommt man in den Child-Nodes relativ einfach da ran.
 

alinnert

Mitglied
Ich hab's befürchtet, ja. Ich hab inzwischen aber herausgefunden, dass es AutoLoad Singletons gibt und das darüber gelöst, ganz ohne Autofac. Mich hatte das mit Autofac trotzdem noch interessiert.

Das über die Parent Scene zu lösen klingt aber nach einer starken Parent-Child-Kopplung. Klingt daher auch nicht sehr optimal, oder?
 

Rushh0ur

Neues Mitglied
Der Godot Singletons Ansatz entspricht ja quasi einer Factory Implementierung.

Die Idee die benötigten Abhängigkeit in der Scene aufzulösen würde die Itterationszugriffe innerhalb der Childs reduzieren.
Ich frag mich in der Hinsicht wie Performant die GetNode Zugriffe mit eine String als Pfad sind....

Nichtsdestotrotz ist die Auflösung von Abhängigkeit am Sinnvollsten in der _Ready Methode.
 
Oben Unten