Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Lua a programowanie gier Kornel Kisielewicz Instytut Informatyki Uniwersytet Wrocławski
25-03-2011 / Lua a programowanie gier
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Spis tre´sci 1
Lua Kilka słów o Lua Metatabele Lua w przemy´sle gier
2
Od strony programisty API programistyczne Generatory wiaza ˛ n´ i luabind
3
Wydajno´sc´ Ogólnie Hybrydowe tablice Maszyna wirtualna Iteratywny od´smiecacz pamieci ˛ LuaJIT Pseudowatki ˛ (korutyny)
4
Rozszerzanie Rozszerzanie natywne Modyfikacja jezyka ˛ i alternatywne implementacje Metalua
5
Finale
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Spis tre´sci 1
Lua Kilka słów o Lua Metatabele Lua w przemy´sle gier
2
Od strony programisty API programistyczne Generatory wiaza ˛ n´ i luabind
3
Wydajno´sc´ Ogólnie Hybrydowe tablice Maszyna wirtualna Iteratywny od´smiecacz pamieci ˛ LuaJIT Pseudowatki ˛ (korutyny)
4
Rozszerzanie Rozszerzanie natywne Modyfikacja jezyka ˛ i alternatywne implementacje Metalua
5
Finale
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Kilka słów o Lua
Kilka słów o Lua ksie˙ ˛ zyc, Roberto Ierusalimschy orginalnie zaprojektowany jako jezyk ˛ reprezentowania danych rozszerzalny, lekki w osadzaniu jezyk ˛ wieloparadygmatowy semantyka bliska Scheme, składni bli˙zsza Pascalowi licencja MIT
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Kilka słów o Lua
Składnia imperatywna, funkcyjna, obiektowa, paradygmatowa jednoprzebiegowa LR, składnia pseudokodu liczby, typ logiczny, ciagi ˛ znaków, tablice hybrydowe, funkcje, watki, ˛ typy u˙zytkownika Silnia -- wyliczanie silni function fact (n) if n == 0 then return 1 else return n * fact(n-1) end end
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Kilka słów o Lua
Tablice jedynym zło˙zonym typem danych jest hybrydowa tablica asocjacyjna ró˙znorodna składnia indeksowania Indeksowanie tab = { 2, 4, 6, color = "blue" } tab[2] -- indeksowanie od 1, wynik 4 tab["color"] -- wynik "blue" tab.color -- to samo co powyzej
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Metatabele
Metatabele metatabele potrafia˛ modyfikowa´c zachowanie tablic i danych u˙zytkownika pozwalaja˛ przecia˙ ˛zy´c indeksowanie, operatory i od´smiecanie pozwalaja˛ na dowolna˛ implementacje˛ obiektowo´sci Przykład monster = { name = "monster", hp = 100, damage = 10, speed = 20, } large_monster = { name = "large monster", hp = 200, } setmetatable( large_monster, { __index = monster, })
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Lua w przemy´sle gier
Indeks TIOBE
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Lua w przemy´sle gier
Gry korzystajace ˛ z Lua Civilization V Crysis 2 i inne gry CryTek’a Heroes of Might and Magic V Homeworld 2 Mafia II SimCity 4 The Sims 2 Star Wars (seria Battlefront, seria Empire at War) The Witcher World of Warcraft (interfejs) ...i wiele innych...
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Lua w przemy´sle gier
Dziedziny zastosowan´ jezyk ˛ konfiguracyjny (zamiast .ini, XML, własnych formatów) jezyk ˛ definiowania danych (zamiast XML, własnych formatów) jezyk ˛ modowania (zamiast Pythona, Ruby czy innych jezyków) ˛ jezyk ˛ debugowania (zamiast komend konsoli) jezyk ˛ logiki i AI (zamiast C++ ;>) metajezyk ˛ danych
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Lua w przemy´sle gier
Jezyk ˛ konfiguracyjny -- Enable/disable debugging through Log() Debug = true -- How verbose do you want the log to be? DebugLevel = 2 -- Work-around for Log() when TraceAI.txt only outputs the very -- last TraceAI() command SingleLineLogs = false -- Maximum number of lines to output (only when SingleLineLogs is true) LogLines = 30 -- Mark the log every X number of milliseconds (0 disables) DebugMark = 20000 -- Debug log path DebugLogPath = "../logs"
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Lua w przemy´sle gier
Jezyk ˛ definiowania danych 10mm ammo ammo LIGHTGRAY 1 81 ITEMTYPE_AMMO 24 100 10mm ammo, the backbone of your firepower. shotgun shell shell DARKGRAY 2 82 ITEMTYPE_AMMO 8 50 Food for your trusty shotguns.
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Lua w przemy´sle gier
Jezyk ˛ definiowania danych Items{ name id color level sprite type ammo ammomax
= = = = = = = =
"10mm ammo", "ammo", LIGHTGRAY, 1, 81, ITEMTYPE_AMMO, 24, 100,
desc = "10mm ammo, the backbone of your firepower.", } Items{ name id color level sprite type ammo ammomax
= = = = = = = =
"shotgun shell", "shell", DARKGRAY, 2, 82, ITEMTYPE_AMMO, 8, 50,
desc = "Food for your trusty shotguns.", }
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Lua w przemy´sle gier
Jezyk ˛ modowania NPC "dying" "townperson" { name = "dying townsman", color = RED, OnTalk = function(self) if player.quest.butcher.inactive then quests.butcher.OnJournal() player.quest.butcher = "active" self.name = "slain townsman" self.pic = "%" elseif player.quest.butcher.active then ui.msg(’"Your death will be avenged."’) player.playsound(’player_avenge.wav’) elseif player.quest.butcher.completed then ui.msg(’"Rest in peace my friend."’) player.playsound(’player_rip.wav’) player.quest.butcher = "closed" end end, } university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Lua w przemy´sle gier
Metajezyk ˛ danych ------------ Vertex Shader for OpenGL 3.0 -----------DeclareShader(’Vertex.GL3.Erosion’, [[ in vec4 Position; void main() { gl_Position = Position; } ]]) ------------ Fragment Shaders for OpenGL 3.0 -----------DeclareShader(’Fragment.GL3.Erosion.Kirk’, [[ out vec4 FragColor; void main() { // ...snip... } ]]) DeclareShader(’Fragment.GL3.Erosion.Spock’, [[ out vec4 FragColor; void main() { // ...snip... } ]])
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Spis tre´sci 1
Lua Kilka słów o Lua Metatabele Lua w przemy´sle gier
2
Od strony programisty API programistyczne Generatory wiaza ˛ n´ i luabind
3
Wydajno´sc´ Ogólnie Hybrydowe tablice Maszyna wirtualna Iteratywny od´smiecacz pamieci ˛ LuaJIT Pseudowatki ˛ (korutyny)
4
Rozszerzanie Rozszerzanie natywne Modyfikacja jezyka ˛ i alternatywne implementacje Metalua
5
Finale
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
API programistyczne
Lua API API jak i jezyk ˛ napisane jest w przeno´snym wspólnym podzbiorze ANSI C i ANSI C++ API oparte jest na stosie co pozwala na łaczenie ˛ Lua z jezykami ˛ niskiego poziomu stos pozwala na elegancka˛ współprace˛ jezyka ˛ niskiego poziomu z wysokopoziomowymi konstrukcjami Lua (ró˙zna ilo´sc´ argumentów, tak˙ze zwracanych, opcjonalne argumenty, tablice)
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
API programistyczne
Uruchamianie Lua w C #include "lua.h" int main( int, char** ) { char* input = "print ’Hello world!’"; lua_State* luaVM = lua_newstate(); if ( !luaVM ) return 1; luaL_openlibs( luaVM ); lua_dostring( luaVM, input ); lua_close( luaVM ); return 0; }
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
API programistyczne
Funkcje w C /* split("hi,ho,there",",") */ static int l_split (lua_State *L) { /* zrzucmy ze stosu pierwszy lancuch */ const char *s = luaL_checkstring(L, 1); /* zrzucmy ze stosu drugi lancuch */ const char *sep = luaL_checkstring(L, 2); const char *e; int i = 1; lua_newtable(L); /* nowa tablica - wynik */ /* dla kazdego separatora */ while ((e = strchr(s, *sep)) != NULL) { /* pchamy substring */ lua_pushlstring(L, s, e-s); /* ustawiamy w tablicy */ lua_rawseti(L, -2, i++); s = e + 1; /* przesuniecie po lancuchu */ } lua_pushstring(L, s); /* pchniecie ostatniego */ lua_rawseti(L, -2, i);/* ustawienie w tablicy */ return 1;/* zwroc 1 tablice na stosie */ } university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Generatory wiaza ˛ n´ i luabind
Generatory wiaza ˛ n´ Lua jest wspierana przez ogólne generatory (np SWIG) posiada te˙z własne dedykowane generatory wiaza ˛ n´ (toLua, toLua++ i inne) luabind
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Generatory wiaza ˛ n´ i luabind
Luabind generuje wrappery w trakcie kompilacji korzystajac ˛ z technik metaprogramowania (za pomoca˛ Boost) jest odpowiednikiem Boost.Python dla Lua
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Generatory wiaza ˛ n´ i luabind
Luabind - przykład #include class Label { public: Label( const std::string& s ) { ... } void print( int x, int y ) { ... } int a; }; void check( const Label& l) { ... } extern "C" int init(lua_State* L) { using namespace luabind; open(L); module(L) [ def("check", &check), class_("Label") .def(constructor()) .def("print", &Label::print), .def_readwrite("a", &Label::a) ]; return 0;
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Generatory wiaza ˛ n´ i luabind
Luabind - zalety wydajno´sc´ porównywalna do tradycyjnych generatorów przezroczysta współpraca z zaawansowanymi mechanizmami C++ - biblioteka standardowa, iteratory, inteligentne wska´zniki wiazanie operatorów, tworzenie wlasciwosci (properties), dziedziczenie klas C++ po klasach w Lua i na odwrót, wirtualnosc miedzy dziedziczeniami ustawianie polityki wlasnosci dla przekazywanych parametrów
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Spis tre´sci 1
Lua Kilka słów o Lua Metatabele Lua w przemy´sle gier
2
Od strony programisty API programistyczne Generatory wiaza ˛ n´ i luabind
3
Wydajno´sc´ Ogólnie Hybrydowe tablice Maszyna wirtualna Iteratywny od´smiecacz pamieci ˛ LuaJIT Pseudowatki ˛ (korutyny)
4
Rozszerzanie Rozszerzanie natywne Modyfikacja jezyka ˛ i alternatywne implementacje Metalua
5
Finale
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Ogólnie
Benchmark
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Hybrydowe tablice
Hybrydowe tablice Lua ma hybrydowa˛ implementacje˛ tablic pozwalajac ˛ a˛ na przezroczyste korzystanie z nich jako standardowych indeksowanych tablic, jak i tablic asocjacyjnych dane w tablicy moga˛ by´c na raz przechowywane w obu reprezentacjach mimo jednolitej składni mamy zatem efektywno´sc´ dwóch osobnych implementacji
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Maszyna wirtualna
local a,t,i a=a+i
a=a+1
a=t[i]
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
PUSHNIL 0 2 GETLOCAL 0 GETLOCAL 2 ADD SETLOCAL 0 GETLOCAL 0 ADDI 1 SETLOCAL 0 GETLOCAL 0 GETINDEXED 2 SETLOCAL 0
1: LOADNIL 0 2 0 2: ADD 0 0 2
3: ADD 0 0 256
4: GETTABLE 0 1 2
Maszyna wirtualna od 17 lat Lua wyposa˙zona jest w maszyne˛ wirtualna˛ oparta˛ na rejestrach, przez długi czas była jedynym powszechnie u˙zywanym jezykiem ˛ taka˛ implementacja˛ wiekszo´ ˛ sc´ "du˙zych" jezyków ˛ skryptowych (Ruby, Python, Perl) ma obecnie maszyny oparte na stosie i du˙zym kosztem próbuje dokona´c konwersji university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Iteratywny od´smiecacz pamieci ˛
Iteratywny od´smiecacz pamieci ˛ ka˙zda instrukcja powodujaca ˛ alokacje˛ pamieci, ˛ wykonuje tak˙ze proporcjonalna˛ ilo´sc´ kroków od´smiecania daje to w miare˛ przewidywalny czas wykonywania instrukcji ustawienia i stan od´smiecacza pamieci ˛ mo˙zna kontrolowa´c zarówno z Lua jak i z API zezwala to na swobode˛ u˙zywania jezyka ˛ nawet w petli ˛ czasu rzeczywistego
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
LuaJIT
LuaJIT kompilator JIT dla Lua obecnie wspierane architektury to x86, x64, ARM i PowerPC wydajno´sciowo mia˙zd˙zy podobne projekty (PyPy, JavaScript V8)
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Pseudowatki ˛ (korutyny)
function permgen (a, n) n = n or #a if n data = 42; return 1; }
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Modyfikacja jezyka ˛ i alternatywne implementacje
Modyfikacje jezyka ˛ dostepne ˛ jest wiele patchy rozszerzajacych ˛ jezyk ˛ o ró˙zne mo˙zliwo´sci samodzielne przystosowanie składni czy te˙z działania jezyka ˛ jest prostsze ni˙z sie˛ z pozoru wydaje pojawiło sie˛ ju˙z wiele wersji alternatywnych
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Modyfikacja jezyka ˛ i alternatywne implementacje
Wersje alternatywne wersje wydajno´sciowe - LuaJIT, Lua na LLVM porty - Lua do Parrot VM, Lua na maszyne JavaVM/.NET implementacje w innych jezykach ˛ - Java, C#, Lua, JavaScript (sic!) modyfikacje jezyka ˛ - Agena (proceduralna), Idle (rozszerzenie), Objective Lua (składnia Obj-C) Metalua
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Metalua
Metalua http://metalua.luaforge.net/ wersja kompilatora pozwalajaca ˛ sie˛ wpia´ ˛c u˙zytkownikowi w proces analizy leksykalnej i składniowej pozwala na tworzenie nowych konstrukcji jezykowych, ˛ analiz˛e statyczna˛ programu, czy te˙z nawet modyfikowa´c drzewo rozbioru programu w trakcie kompilacji posiada bogaty zestaw standardowych rozszerzen´ (match, let-in, continue, operator trynarny, wyjatki, ˛ leniwa ewaluacja, splice) kod generowany jest kompatybilny ze standardowa˛ maszyna˛ wirtualna˛
university-logo
Lua
Od strony programisty
Wydajno´sc´
Rozszerzanie
Finale
Metalua
Metalua - przykład 1 -- sito Eratostenesa w Metalua -- lekser = pythonic.lua function print_sieve (limit): local sieve, i = { }, 2 while i