Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.06.2013, 08:14

Implementierung von Lua: Variablen Mappen

Moin, moin.
Leider findet man nicht ganz soviel Informationen zur eigentlichen Implementierung von Lua, deshalb hier mal die Frage:
Wie genau mappe ich denn nun Variablen? Also, mit anderen Worten: Auf die Variablen die ich meinem Programm habe, kann ich auch von meinem Lua Script aus zugreifen.
Dieses ganze Stack rumgemache, gefällt mir leider überhaupt gar nicht. Gibts nicht einen schnelleren Weg? In dem man eine C Variable auf die gleiche Speicheraddresse wie ihr Lua Gegenstück zeigen lässt?
Get Global und Set Global kommt auch nicht in Frage, da würde ich ja ewig viel jeden Frame umherschieben.
Insgesamt erscheint es mir doch sehr umständlich oder habe ich etwas übersehen?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

21.06.2013, 10:17

Das geht nicht.
Normalerweise sind die Objekte, die man in Lua hat, eine Art Wrapper um die "realen" Objekte.
Mit dem Stack musst du eigentlich nicht viel hantieren, schau dir mal luabind an. Das bietet dir sehr komfortable Möglichkeiten, um den Übergang zwischen C++ und Lua so schmerzlos wie möglich zu machen.

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

3

21.06.2013, 22:50

Eigentlich ist Lua da noch sehr bequem und gut designed. Dank des Stacks ist das gesamte API wesentlich schlanker und einfacher als z.B. das des wuchtigen Ruby. Als Lua-Nutzer kann ich dir im Übrigen LuaJIT empfehlen: Vom API her völlig kompatibel zu CLua, bloß je nach Anwendungsfall bis zu 120mal schneller.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

4

22.06.2013, 13:12

Danke für eure Antworten. :)
Leider sind beide Bibliotheken nicht so ganz das was ich eigentlich suche, wenn ich nichts falsch verstande habe. Luabind braucht Boost und das ist mir ein wenig zu "heavy" nur um die Bindings zu vereinfachen, zumal ich auch auf möglichst wenig C++ ausweichen wollte und die meisten Dinge lieber im C Stil mache. ;)
Die Idee von LuaJIT ist zwar an sich ganz nett, allerdings habe ich die Scripte ja, damit man das Spiel ohne große Probleme modden kann. Wenn man erst neu kompilieren müsste, würde dieser Vorteil wegfallen oder funktioniert LuaJIT auch als Byte Code Interpreter?

Was wäre denn eine effiziente Methode um das mit den Bindungs zu machen? Habe bestimmte Variablen die global in allen Lua Scripts verfügbar sein müssen und dann noch welche die quasi nur in einzellnen Scripts verfügbar sein sollen.

5

22.06.2013, 22:40

JIT bedeutet, dass es erst zur Laufzeit kompiliert wird. (wobei hier, wenn ich richtig gesehen habe auch eine Möglichkeit zum Abschalten des JIT-Kompilers und Verwenden eines Interpreters vorhanden ist)
Wenn ich das richtig sehe wäre es hier wie bei Java, dass man eben diese Zwischenform als Bytecode hat, ob der interpretiert oder kompiliert wird sollte daher in diesem Fall egal sein (außer von der Geschwindigkeit), Hauptsache es kommuniziert richtig mit dem in C verfassten Programm.

6

23.06.2013, 11:43

Hm okay, mag sein. Ist ja auch relativ egal, LuaJIT könnte ich nachher immernoch implementieren.
Wenn ichs aber nicht schaffe Variablen zu mappen, dann brauche ich garnicht erst anfangen irgendwas zu machen. :P

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

7

25.06.2013, 22:52

Zitat

Die Idee von LuaJIT ist zwar an sich ganz nett, allerdings habe ich die Scripte ja, damit man das Spiel ohne große Probleme modden kann. Wenn man erst neu kompilieren müsste, würde dieser Vorteil wegfallen oder funktioniert LuaJIT auch als Byte Code Interpreter?
LuaJIT ist API und ABI -kompatibel zu Lua. Es sieht also von außen aus wie CLua mit ein paar Extras. Mit aktiviertem JIT-Compiler (Standard) werden Lua-Scripts (also nichts zu ändern) in Maschinen-Code übersetzt und erst dann ausgeführt. Der JIT-Compiler funktioniert auf IBM Power, PowerPC, MIPS, x86, x86_64, und da war glaub' ich noch was. Gibt es keinen JIT-Compiler für die Architektur oder stellst du ihn ab, wird Lua-Bytecode durch eine VM gejagt, also ganz wie in CLua. Du kannst also jetzt schon LuaJIT verbauen - du wirst keinen Unterschied zu CLua bemerken, mal von der Geschwindigkeit abgesehen.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

Werbeanzeige