Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What strategy should be used when exposing c++ to Lua

Tags:

lua

I have a c++ library which has functionality exposed to Lua, and am seeking opinions on the best ways to organise my lua code.

The library is a game engine, with a component based Game Object system. I want to be able to write some of these components as classes in Lua. I am using LuaBind, so I can do this but there are some implementation choices I must make, and would like to know how others have done it.

Should I have just one global lua_State, or one per object, one per scene, etc? This sounds like a lot of memory overhead, but will keep everything nice and separate.

Should I have one GLOBALS table, or one per object, which can be put in place before a call to a member? This would seem to minimize the chances of some class deciding to use globals, and another accidentally overwriting it, with less memory overhead than having many lua_States.

Or should I just bung everything in the one globals table?

Another question involves the lua code ittself. Two strategies occur... Firstly shoving all class definitions in one place, loading them when the application launches, Secondly putting one class definition per file, and simply making sure that file is loaded when I need to instance it.

I'd appreciate anyone's thoughts on this, thanks.

like image 735
DaedalusFall Avatar asked Sep 08 '09 19:09

DaedalusFall


1 Answers

While LuaBind is certainly very nifty and convenient, as your engine grows, so will your compile times, drastically.

If you already have, or are planning to add, a messaging system (which I heavily recommend, specially for networking), then it simplifies problems significantly. In this case, what you will need to do is simply bind a few key functions to interface with the messaging system. This will keep your compile times down, and give you a very flexible system.

Since you are doing a component based engine (Good choice BTW), It makes more sense to integrate scripting as an object component. This way, it usually makes more sense to make each scripting component a new coroutine that runs behavior for each particular object. You need not to worry about memory too much, Lua states are very light, and can be made really fast if you interface your memory manager with Lua.

If you implement scripting as a component, it is still a good idea to have global or per-level scripts loaded, (to coordinate event triggers by other objects, or maybe enemy spawning timers).

As far as loading scripts go, it would not be bad practice, to just load the scripts you will need for a level all at once, and keep them in a global table for fas accessing, loading of lua scripts is pretty fast, specially if you pre-compiled them.

like image 198
Ramon Zarazua B. Avatar answered Jan 01 '23 21:01

Ramon Zarazua B.