Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 6. listopad 2016, 13:18:53 Předmět: Lua C++ Wrapper |
|
|
Poslední dobou jsem měl více času, takže jsem se konečně dostal na to, abych se podíval na jazyk Lua a jeho přidání do mého enginu.
Potřeboval jsem wrapper pro C++. Sice je plno existujících variant, ale
a) Pořádně jsem nepobral jak fungují a procházet zdrojáky byl děs / běs. Většina navíc není C++11, takže plno věcí je tam dost přes ruku, když jde napsat kratším způsobem.
b) Chtěl jsem si to zkusit napsat sám (no zabralo to jen cca. 3 týdny... ale ne soustavné práce )
c) Konečně jsem více pochopil templates v C++11
Každopádně, zatím pořád work-in-progress, ale dávám první verzi:
https://github.com/MartinPerry/LuaWrapperCpp
Byl bych rád, kdyby se někdo podíval a případně mi napsal připomínky. Určitě to není moc "hezký" kód, místy je tam dost bordel. Nicméně zatím to splňuje moje požadavky na funkčnost.
Díky
PS: Překlad zatím testován jen pod Visual Studiem 2015. S velkou pravděpodobností tam něco bude vadit pro gcc / clang, ale to zatím nemám jako prioritu
PPS: Zatím jsem neřešil memory-leaky A určitě tam jsou, i když se snažím uklízet  _________________ Perry.cz |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 6. listopad 2016, 14:45:19 Předmět: |
|
|
Promiň za rýpnutí, ale jestli tomu rozumím:
- Nerozumím cizímu kódu -> napíšu si to odznova.
- Vyšší verze programovacího jazyka umí zpřehlednit a uspořit 10 % kódu, takže přepíšu všechen kód aplikace a knihoven (a s příští verzí znova).
- Výsledek je stejně jen work-in-progress, takže pro ostatní nevhodný.
|
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 6. listopad 2016, 16:29:39 Předmět: |
|
|
1. Nikdy jsem moc "template-heavy" kód nepsal, takže existujícím knihovnám na tomhle postaveným jsem moc nerozuměl (plus jako obvykle, nikdo pořádne nekomentuje, takže...). Občas se mi třeba úplně nelíbila struktura nebo funkčnost dané knihovny (na to nepotřebuju rozumět kódu, prostě vidím jak se používá).
Celkově pro mě bylo snažší se to naučit tím, že si to sám naprogramuju, než se vrtat v cizím kódu a snažit se tam "nacpat" co potřebuju.
Plus pro příště už to budu umět. Za mě to rozhodně ztráta času nebyla. Navíc tím že ten kód znám, tak se mi do toho snadno dopisuje nová funkcionalita, kterou např. existující knihovny nemají.
2. Nechápu... nikde o 10% nic neříkám.
3. Výsledek je pro mě. Nikdo jiný to používat nemusí. Chtěl jsem pouze případné typy ohledně kódu. Je sice fajn, že něco nakodím, ale když mi nikdy nikdo neřekne jestli je to celý blbě nebo ne, tak budu pořád kodit blbě a dělat stejné chyby. Jedna věc je "funkční" druhá věc je "jak je to naprogramovaný". Např. sorting v n^3 je taky funkční, setřídí čísla... ale pro praxi moc použitelný není... _________________ Perry.cz |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 7. listopad 2016, 17:21:21 Předmět: |
|
|
Co jsem na to zběžně koukal (ty templaty jsou na mě moc hardcore), tak vzhledem mi to přijde pěkné a přehledné (jedna z mých největších slabin).
Jenom jedna drobnost: delete na nulový pointer nemusíš obalovat ifem.
A ještě pro Ladise:
- bastlením všeho z 3rd party kódu se nic nenaučíš
- ad 2) určitě ano pokud to zjednoduší/zpřehlední kód, nejen pokud se to týká nového standardu,
protože z hlediska údržby si na svých projektech nemůžeš dovolit to co velké firmy,
tj. najmout si 100 lidí co to lejno (pokud to necháš do této fáze dospět) budou za tebe udržovat |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 9. listopad 2016, 09:37:36 Předmět: |
|
|
Každý má jiný styl a zvyklosti, ale osobně bych poladil interface. Sám jsi psal, že si nejsi jistý, zda tam nejsou memory leaky. Ani se nedivím!.
Například:
kód: |
LuaScript * LuaWrapper::AddScript(const LuaString & scriptFileName); |
Mám pak na LuaScript volat delete, nebo něco jinýho? Nebo nic a script se uvolní sám? V main.cpp jsi nezavolal nic! :-). Klidně bych použil std::shared_ptr. Případně nějaký menší wrapper objekt a vrátit ho hodnotou (move).
Snaž se aby věci vytvořené přes new neopustily daný kontext. Takovej kód prošpikovanej pointerama a new a delete už dneska nemáme zapotřebí. Jen tim nahráváme takovým těm věčným rejpalům s garbage collectorama.
Dále:
Musí ta LUA běžet v jedný instanci? Já bych ten singleton dal pryč. Ne že by se s tim nedalo žít, ale taky je to takový neohrabaný a svádí to k používání odkudkoliv (nepřehledný návrh). Nehledě na multithreading. Předej ten LuaWrapper referencí v nějakým kontextu a uvidíš, že to je lepší.
A ještě tohle:
kód: |
void RegisterClass(const LuaClass & classBind);
void RegisterClass(const LuaClass * classBind); |
Co si vybrat? :-) _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 9. listopad 2016, 18:43:44 Předmět: |
|
|
To že je to singleton, to byl záměr abych nemohl vytvořit více instancí toho wrapperu, protože to moc nedávalo smysl s ohledem na ten binding metod / globálních proměnných. Popřemýšlím jak to případně upravit...
Ten wrapper by měl po sobě uklidit paměť při jeho "zabití". Což když z toho vytahám reference tak mi zbyde "dangling" pointer a to je blbé. Nicméně vetšinou ten wrapper zabíjím spolu s enginem, takže v mém případě to až tak nevadí.. nicméně jako obecná knihovna je to ale špatný, nějak to zkusím upravit přes shared pointery (který jsem teda nikdy npoužíval, nějak se mi líbí raw pointer )
Ty dvě metody obě dělají to samé Jen jsem tam dal obě varianty... můžu jednu smazat  _________________ Perry.cz |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 10. listopad 2016, 10:05:04 Předmět: |
|
|
Ad singleton:
Já si zase celkem umím představit, že by více instancí mohlo někde dávat smysl. Napadá mě např. loading (načteš skripty pro novou misi a zahodíš všechno starý). No ale i kdyby to smysl nedávalo, tak u singletonu nikdy nevíš, který vlákno ti na něj hrábne, takže musíš do všeho cpát mutexy. Jsou ale případy, kdy se to hodí (logování).
Ad pointery:
shared nebo unique poslouží. Co se týče hlídání toho, aby se wrapper uvolnil jako poslední, na to bych použil asserty a/nebo výjimky.
Obyčejný pointery mám taky rád (kdo by neměl ;-) ), ale jak sem už psal, je vhodné je používat v rámci malého písečku (třída, metoda), ne je roztahat po celým interface. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
|