AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Threads und LUA parser

Ein Thema von roboter202 · begonnen am 23. Apr 2012 · letzter Beitrag vom 23. Apr 2012
Antwort Antwort
roboter202

Registriert seit: 6. Mär 2011
98 Beiträge
 
Delphi 6 Professional
 
#1

Threads und LUA parser

  Alt 23. Apr 2012, 15:11
Hallo,

Ich schreibe gerade ein Spiel und es soll so sein, dass man für jedes Level ein LUA Script schreiben kann, das zu beginn des Levels ausgeführt wird. Über Funktionen kann das Script dann mit dem Game und der Welt interagieren z.B. wenn Spielposition = xy dann öfnen Tür oder so.

Mein Problem ist ich muss das Script und die anderen Sachen wie "input", "update", "draw" parallel ausführen denn im Script wird es vermutlich immer einen While-Schleife geben in der geprüft wird ob was gemacht werden muss.
Dazu habe ich mir gedacht ich mach einfach 2 Threads die sich dann einmal um das Script und einmal um das Game und die Grafik kümmern.

Ich brauche in meinem Parser Thread nur leider auch einige Funktionen die "sychronized" ausgeführt werden müssen nur wenn ich die dann bei dem lua parser registriere:
 lua_register(L, 'getPlayerPos', lua_getPlayerPos); dann bekomme ich den Fehler das lua_getPlayerPos ja eine Methode und keine Prozedur wäre ich muss die jedoch als Methode haben damit ich sie "sychronized" ausführen kann!!

ALSO:
Was kann ich tun?
Gibt es eine andere Möglichkeit?
Kann ich das vielleicht auch ohne Threads machen und dann die Ausführung von lua_dofile() zeitlich begrenzen sodass ich ihm sage berechne jetzt 5ms das Script brich dann ab mach was anderes und setzt das Script nachher fort?

Ich hab schon daran gedacht es so zu machen das das Script ohne While Schleife aufgebaut werden muss und dann jeden Tick (100ms oder so) neu ausgeführt werden soll.

PS: Ich bin eig. erst beim Level Editor aber ich muss so etwas vllt. jetzt schon für später berücksichtigen.

Gruß roboter202
Christian
i := 0 ; While i = 0 do beep ;

Geändert von roboter202 (23. Apr 2012 um 15:15 Uhr) Grund: R3cTscHreibf3h1er
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#2

AW: Threads und LUA parser

  Alt 23. Apr 2012, 15:35
Besorg dir "Lua Programming Gems", erstes Kapitel

Im Grunde kannste das halten wie du willst, du kannst einen Lua-Kontext pro Thread separat anlegen - das ist die üblichste Methode. Wichtig wird die Frage an den Stellen wo sich Aufgaben überschneiden und du synchronisieren mußt. Das kann aber dann in deinen C-Routinen passieren und muß ja nicht zwangsläufig im (vermutlich unabhängigen) Lua-Code passieren.

Lua wird übrigens nicht LUA geschrieben, da es ein Wort (portugiesisch für Mond) und nicht eine Abkürzung ist.

Übrigens: schau dir auch LuaJIT an.

Noch eins: wieso muß es eine Methode sein um es synchronisieren zu können. Ich ahne du benutzt die unsägliche TThread-Klasse, richtig?
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)

Geändert von Assarbad (23. Apr 2012 um 15:38 Uhr)
  Mit Zitat antworten Zitat
roboter202

Registriert seit: 6. Mär 2011
98 Beiträge
 
Delphi 6 Professional
 
#3

AW: Threads und LUA parser

  Alt 23. Apr 2012, 15:41
Ok also eig. wollte ich es nicht sooo kompliziert machen. Es soll eig. nur ein "kleines" Projekt für die Schule werden und nicht meine Altersvorsorge

Und C rutinen hab ich auch nicht. Also wenn es nicht irgendwie "heuristisch" geht dann mach ich es vermutlich so wie im 1. Post angedeutet.

Zitat:
Ich hab schon daran gedacht es so zu machen das das Script ohne While Schleife aufgebaut werden muss und dann jeden Tick (100ms oder so) neu ausgeführt werden soll.
PS: Ich hab Lua groß geschrieben weil es wichtig ist einfach so halt.
Christian
i := 0 ; While i = 0 do beep ;
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#4

AW: Threads und LUA parser

  Alt 23. Apr 2012, 15:46
Und C rutinen hab ich auch nicht. Also wenn es nicht irgendwie "heuristisch" geht dann mach ich es vermutlich so wie im 1. Post angedeutet.
Das kann ich nicht nachvollziehen. Was ist hiermit?:

Code:
lua_register(L, 'getPlayerPos', lua_getPlayerPos);
... lua_getPlayerPos ist ganz offensichtlich eine C-Routine. Und für den Fall daß sie in Delphi implementiert ist, nennt man das (wg. der Schnittstelle) trotzdem noch C-Routine.

Ich hab schon daran gedacht es so zu machen das das Script ohne While Schleife aufgebaut werden muss und dann jeden Tick (100ms oder so) neu ausgeführt werden soll.
Kannst du, außer auf einem Echtzeitsystem, nicht garantieren. Über welche Form von Daten reden wir denn bei der Position? Integer? 32 oder 64bit, bspw.? Dann kannste auf Windows die atomischen Interlocked*-Funktionen benutzen. Sowohl zum schreiben wie auch zum Lesen. Da muß man keine großartige Synchronisation einbauen. Deswegen ist es sinnvoll in einer Frage immer auch das Einsatzszenario zu beschreiben und nicht nur das aktuell (angenommene) Problem lösen zu wollen. Wenn man sich schon ans Hive-Mind wendet kann man ja auch gucken ob es nicht noch einen besseren Lösungsansatz gibt
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)

Geändert von Assarbad (23. Apr 2012 um 15:50 Uhr)
  Mit Zitat antworten Zitat
roboter202

Registriert seit: 6. Mär 2011
98 Beiträge
 
Delphi 6 Professional
 
#5

AW: Threads und LUA parser

  Alt 23. Apr 2012, 18:20
Ok sorry Du hast recht
wenn es eine C-Rutine ist weil hinten dieses cdecl; dran hängt dann ja. Ich hab halt nur noch nie mit so etwas gearbeitet.

Wie auch immer hier ein paar mehr Infos hatte vorhin leider nicht wirklich viel zeit.

Was habe ich? - noch nix
Was glaube ich später einmal zu haben?

Diese Funktion mit dem getPlayerPos gibt es noch nicht und ich weis auch noch nicht welche genau ich einbauen werde.
Aber das Spiel wird eine Klötzchen-Welt sein mit speziellen Blöcken die z.B. Ausfahrern können oder auf die man etwas drauf legen kann oder die wie Federn funktionieren oder Knöpfe, ... Mit disen Objekten soll man dann über das Script interagieren können.

z.B. Wenn der Knopf gedrückt wurde und Auf dem einen Objekt etwas drauf liegt dann fahre den Block aus.
Ich werde das vermutlich auch mit Events machen die man sich dann über einen Befehl im Script übergeben lassen kann.

Fest steht: Ich werde wohl oder übel Funktionen brauchen die als Schnittelle zwischen Welt/Spiel und Skript dienen. Mit der Rückgabe von Werten muss ich mich noch etwas befassen aber ich denke das sollte kein allzu großes Problem werden. Mein Befürchtung ist das ich diese synchronisiere ausführen muss.

Ich werde mir jetzt mal was über die Interlocked*-Funktionen informieren.

Leider kann ich dir kein Einsatzszenario beschreiben weil ich noch keins habe sondern zuerst nur theoretisch mein Projekt überdenke.
Christian
i := 0 ; While i = 0 do beep ;
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#6

AW: Threads und LUA parser

  Alt 23. Apr 2012, 19:26
Leider kann ich dir kein Einsatzszenario beschreiben weil ich noch keins habe sondern zuerst nur theoretisch mein Projekt überdenke.
Alles klar. Machbar sind die Szenarien soweit du es beschrieben hast alle, die Frage ist nur inwieweit die Lua-Skripte sich alle den selben Lua-Status teilen müssen/sollen oder eben nicht.

Schreib einfach ne neue Fragen wenn du weißt was es genau werden soll
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz