Banner left   Banner center   Banner right

Germanenglish Home · News · Diary · Screenshots · Documentation (Wiki) · Downloads · Guestbook · Forum

Home · Benutzer registrieren · Suchen · Statistik · FAQ · Benutzerliste

Zur Zeit online: keiner ausser dir

 X-Force - Fight For Destiny - Forum —› X-Skript / Developer-Pack —› Ausführung von parallelen Skripte

Autor Mitteilung
verfasst am: 09.05.2010, 11:56 · Edited by: sujin
Spielsatz Alliances

Registrierdatum: 14.07.2004, 14:47

 Beiträge: 1185
Wie läuft das eigentlich? Wenn ich einen BE mit drei Aliens habe, und alle drei das gleiche AI-Skript haben, in dem z.B. an globalen Variablen rumgepfuscht wird - kann ich wissen, ob zum Beispiel sowas immer funktioniert, wie es soll (dasdas Skript foo nur einmal gestartet wird)?
if (game_api_CheckGlobalVar(SWITCH) = gvtNotDefined) then
begin
  game_api_RegisterBoolean(SWITCH);
end;
game_api_SetBoolean(SWITCH, False);
if (not game_api_GetBoolean(SWITCH)) and
  (groundAI_api_GetRunningGround() <> nil) then
begin
  game_api_SetBoolean(SWITCH, True);
  mission_api_StartScriptWithObject('foo',
                                    whatever);
end;
mission_win();

Wirklich parallel werden die Skripte wohl kaum ausgeführt (Multicore-CPUs ausgenommen, falls Delphi das unterstützt), aber geben die Skripte die Stafette nach je einem Byte-Opcode oder nach 50 ab?

Ich hoffe, meine Frage ist einigermaßen verständlich.
verfasst am: 09.05.2010, 13:20 · Edited by: Natter
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Parallel kannst du vergessen. Selbst wenn man einen Multicoreprozessor hat und selbst wenn Delphi dss unterstützen würde - dann müsste der Quellcode immernoch dafür ausgelegt sein. Und dass ist eine extrem schwierige Geschichte, die in einem Rundenbasierten spiel imho völlig unnötig ist. Das Ganze läuft immer linear ab, ein Befehl nach dem anderen.
verfasst am: 09.05.2010, 13:28
Spielsatz Alliances

Registrierdatum: 14.07.2004, 14:47

 Beiträge: 1185
Also so?
- Skript 1 macht einen Befehl
- Skript 2 macht einen Befehl
- ...
- Skript N-1 macht einen Befehl
- Skript N macht einen Befehl
- Skript 1 macht einen Befehl
- ...
Und wenn ja, was zählt als Befehl? Alles von einem ; zum nächsten, oder 1 Pascalscript-Opcode (der vermutlich deutlich kleiner ist)?
verfasst am: 09.05.2010, 13:35 · Edited by: Natter
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Du musst überlegen, wann ein Skript vom Programm aufgerufen wird. Wenn z.B. 2 Skripte auf ein Event reagieren, dann wird in beiden Skripten die damit verknüpfte Funktion aufgerufen. Da aber immer nur ein Befehl auf einmal aufgerufen werden kann, wird natürlich auch zuerst in Skript A die entsprechende Funktion aufgerufen. Daraufhin "verliert" das Hauptrogramm die Kontrolle bis diese Funktion abgearbeitet wurde (sonst hätte man ja wieder Parallelität). Erst wenn das Skript A nix mehr zu tun hat kann dann vom Hauptprogramm für das Event die entsprechende Funktion in Skript B aufgerufen werden. Prinzipiell wird ein Programm niemals wahllos zwischen verschiedenen Programmzeilen hin und her springen, sondern immer Zeile für Zeile abarbeiten. Wird irgendwo eine Funktion aufgerufen, so wird diese zunächst vollständig abgearbeitet ehe es weiter geht. Um dafür ein besseres Gefühl zu bekommen, kannst du deine Skripte in medit ja mal Zeilenweise ausführen.
verfasst am: 09.05.2010, 13:39
Spielsatz Alliances

Registrierdatum: 14.07.2004, 14:47

 Beiträge: 1185
Cool, danke. Determinismus ftw ;-)
verfasst am: 13.05.2010, 23:20
Spielsatz Alliances

Registrierdatum: 14.07.2004, 14:47

 Beiträge: 1185
Das scheint doch nicht so zu funktionieren, wie ich es mir dachte... der eingangs gepostete Code sorgt nämlich eben nicht dafür, dass 'foo' nur einmal gestartet wird.
Zur Erklärung: Ich wollte mir den Umweg sparen, ein extra Skript für jeden Fall, in dem ich es einsetze, zu schreiben und habe mir gedacht, ich könnte es ja eine Alien-AI wie weiteroben gepostet schreiben, die einfach nur die Kontrolle an foo weitergibt. Aber wie ich jetzt mit Messageboxen erfahren habe, startet das Skript einmal, wo noch kein Alien im BE ist, dann nochmal mit einem, wieder mit zweien, usw.

Vorschläge?
verfasst am: 13.05.2010, 23:25 · Edited by: Natter
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Etwas mehr Beispielcode wäre glaube ganz hilfreich ;)

Vom Prinzip her müsste es mit einer solchen Abfrage klappen. Wobei in obiger Funktion ja immer

game_api_SetBoolean(SWITCH, False);



aufgerufen wird. Folglich ist auch die nachfolgende if-Abfrage sinnlos (weil sie immer ausgeführt wird).
verfasst am: 14.05.2010, 00:12
Spielsatz Alliances

Registrierdatum: 14.07.2004, 14:47

 Beiträge: 1185
Ach ja... ich bin mal wieder blind 8)
Das Setzen auf False muss im gestarteten Skript passieren.



Du musst dich registrieren um auf dieses Thema zu antworten.
Login :: » Name » Passwort

Ladezeit (sec.): 0.012 · Powered by miniBB 1.6 with parts of 1.7 © 2001-2003