Lua a programowanie gier

Lua Od strony programisty Wydajno´sc´ Rozszerzanie Finale Lua a programowanie gier Kornel Kisielewicz Instytut Informatyki Uniwersytet Wrocławski...
4 downloads 1 Views 778KB Size
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