Przypisanie wskaznika na funkcje z Lua w C++

0

Witam
Mam pewien drobny problem, mianowicie potrzebuje wywolywac funkcje ze skryptow Lua bezposrednio w kodzie c++ ale poprzez wskazniki na nie. Czyli nie poprzez luabind::call_function<..>(...) ale wczesniej powiazac to z okreslona funkcja i przez nia wolac. luabind w realtime jest raczej powolna wiec mysle ze lepiej by bylo 'zbindowac' te funkcje podczas inicjalizacji programu do jakiegos wskaznika na funkcje i wywolywac je przez niegow kodzie c++. Czy to moze jest niepotrzebne i nic nie da ( lub jest niemozliwe) ?
Chodzi mi o cos takiego w pseudokodzie
[code]
...
void setup() // wywolywane tylko raz podczas inicjalizacji
{
func_ptr = getPointerToLuaFunc(LuaState, function_name.c_str());
}
...
void update_something() // wywolywane caly czas
{
...
func_ptr();
...
}
[/code]
Chodzi mi tutaj tylko o wydajnosc bo wydaje mi sie ze wywolywanie funkcji na podstawie stringa z nazwa nie jest raczej wydajnym podejsciem ? Nie wiem jak dziala luabind od srodka bo zapewne skoro korzysta z boosta i szablonow to jakos to jest wiazane na etapie kompilacji ale wydajnosciowo to mocno kuleje z tego co zaobserwowalem.

0

jestes pewien ze to w ogole ma sens? o ile dobrze pamietam, LUA umozliwia tak jak Ruby czy Python dynamiczna redefiniowanie/wymiane funkcji, wiec jezeli sobie zcacheujesz jakis binding symbolu, to uzywajac potem 'starej' wartosci, bezdiesz caly czas uzywal 'starej' funkcji, a nie jej najnowszej wersji! chyba ze masz gwarancje, ze nikt z poziomu lua jej nie zmieni? to wtedy cacheowanie jak najbardziej jest sensowne.

0

Dziekuje za odpowiedz

Generalnie faktycznie moze byc problem z tym co mowisz bo tak teraz na to spojrzalem to i widze ze faktycznie nie ma sensu bo po to wiazalem Lua zeby mozna bylo sobie dowolnie podmieniac skrypty itd.

Wiec moze da sie jakos, juz nie mowie o Lua ale ogolnie jesli chodzi o jezyki skryptowe zeby mozna bylo je skompilowac w czasie dzialania programu ( np. podczas inicjalizacji - mam wtedy znane wszystkie nazwy funkcji, parametry i zwracane typy w skryptach i chce je powiazac w kodzie w sposob jaki zaprezentowalem w pierwszym poscie). Po prostu chodzi mi o mozliwosc tworzenia konkretnej funkcjonalnosci poza kodem programu ( a kod to tylko podstawowa funkcjonalnosc i wywolywanie odpowiednich funkcji ze skryptow w odpowiednim momencie i czasie) w jakims jezyku skryptowym ale w taki sposob, zeby bylo to skompilowane do normalnego kodu a nie przez jakas maszyne wirtualna odpalane.

0

ale, ale.. jeżeli szukasz optymalizacji, bo cos tam dziala Ci zbyt wolno, to raczej szukasz jej w zlym miejscu. "maszyna wirtualna" LUAy jest bardzo skąpa i "przelotowa". już Ruby jest od niej cięższy a i tak jest dość szybki. z tego co pamiętam WorldOfWarcraft używa LUAy i wiele innych gier również, więc jest małó prawdopodobne aby w niej byl problem. probowales analizowac swoja architekture komunikacji? albo liczby wywolan kluczowych funkcji przy wykonywaniu rzeczy "przymulających"? nie da sie ich zredukowac do krotszych?

formalnie, sadze ze da się napisać preprocesor-translator z LUA do np. C czy C++. nie wiem czy istnieje juz gotowy akurat dla tej pary języków. w cale nie zdziwiłbym się gdyby istniał. LUA jest dość podobna do JS, a JS2C już gdzieś kiedyś mi mignął, więc może i LUA2C już jest. A jeżeli nie ma, to możesz probowac samemu napisać - nawet z jej dynamizmem i podmiana funkcji w obiektach, dopoki nie bedziesz mial w kodzie w LUA czegos w stylu dynamicznego sklejania kodu jako string i wykonywania tego pozniej (coś ala eval('5+3')), powinno sie to dać w miare wprost przetlumaczyc na C. jednak po co? piszac dobry translator, bedziesz musial stworzyc ładny 'systemik' emulacji zachowania się silnika LUAy, w efekcie raczej uzyskasz taki smieszny efekt, ze kawałek Twojego programu zmutuje w coś-ala-runtime LUAy, napisany przez Ciebie, używany przez kod wypluty z translatora. I w efekcie pewnie będzie całkiem przypominał to, co znajdujesz obecnie w silniku LUA. Jesli sadzisz ze potrafisz lepiej napisac fragmenty tego silnika, albo ze translator napisany przez kogos potrafi, to moze lepiej wziac po porstu silnik LUA na warsztat i go przyspieszyc tymi fragmentami?

Ale tak tylko sobie paplam. W gruncie rzeczy Ty wiesz co chcesz zrobic i dlaczego tak a nie inaczej, wiec sie nie sugeruj tym co pisze za bardzo.

jesli chodzi o translator, to wiedzialem ze mi juz mignal.. http://lua-users.org/wiki/LuaToCee
jednak wersja 0.2 nie obiecuje wiele:)

0

Dziekuje za ponowna odpowiedz

No coz, masz racje - Lua jest uzywana w grach, nawet podobno w Crysisie. 'Problem wydajnosciowy' polega na tym, ze porownywalem wydajnosc kodu napisanego w c++ do tego wywolywanego z luabind i czas wykonania prostej kolizji w kodzie c++ byl rzedu ulamkow 0.1ms, wolajac ja z lua to juz po ~10 ms bylo co dla wiekszej liczy kolidujacych obiektow jest problemem ( juz nawet wywolanie pustej funkcji z Lua tez sporo kosztuje ). Byc moze bledem jest to ze probuje wszystko wcisnac do Lua, nawet obliczenia fizyczne czy podmiany callbackow ( czyli wywolywane po kilkadziesiat razy na klatke) ale przyswieca mi idea mozliwosci moddingu kazdego szczegolu w grze.
Zerknalem na to Lua To Cee i faktycznie, jesil by to byla wersja blizej 1.0 to o takie cos mi chodzi. Moze sprobuje napisac cos podobnego ( interesuje mnie tylko funkcjonalnosc podobna do c/c++, nawet okrojonego bez zadnych fajnych rzeczy ktore Lua udostepnia) co moze byc ciekawym wyzwaniem.

Dziekuje za pomoc i pozdrawiam :)

0

LuaJIT - kompiluje Lua w locie do kodu natywnego, znacznie podnosi wydajność.

0
LuaJIT napisał(a)

LuaJIT - kompiluje Lua w locie do kodu natywnego, znacznie podnosi wydajność.

Oo, dzieki wielkie ! To jest to co mi potrzeba :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1