Aneb perzistence na Demone v akci! Pokud jste ostřílení WB jistě jste už narazili na problém jak ukládat některé hodnoty postav (například obsah trezoru nebo stav bankovního konta postavy). Jak jistě víte BioWare po velkém tlaku ze strany hráčů přidala do hry Database Access (patch 1.30), tedy jednoduchou databázi, kam se mohli ukládat perzistentní proměnné. Ale jak už to u BioWare bývá udělala nám to trochu složitější, možná proto aby otestovala naší inteligenci. WB na Demone brzo narazili při implementaci perzistence pomocí BioWare databáze na velké problémy, databáze nekontrolovaně rostla, přistup do databáze způsoboval lagy a data se záhadně ztrácela. George (WB na Demone) nedávno udělal důkladnou analýzu způsobu ukládání a čtení dat do BioWare databáze. Pokud jste zvědavý co objevil, přečtěte si jeho mnou trošku opravený text:
Standardní NWN používá Databázi (dále jen DB) na bázi starého FoxPro. Kromě standardních problémů Foxky má NWN varianta i tyto další nešvary:
- funkce DeleteCapmaignVariable () záznam nemaže pouze ho označí jako „smazaný“
- neexistuje funkce pack () která by tyto záznamy dokázala odstranit
- stejné záznamy (řádky se stejným jménem pole) )typu String nebo Object se nepřepisují ale „smažou se“ a vytvoří nové.
- stejné záznamy (řádky se stejným jménem pole) )typu Int nebo Float se přepisují.
Příklad:
DB:
- „ITEM1“ „roba_maga“
- „ITEM2“ „roba_klerika“
- spustím SetCampaignString („DB“,“ITEM1″,“roba_zlodeje“)
DB:
- * „ITEM1“ „roba_maga“ – označený jako smazaný
- „ITEM2“ „roba_klerika“
- „ITEM1“ „roba_zlodeje“
Je zřejmé že při častém ukládání do DB se tato naprosto neuvěřitelně zvětšuje. Pokud mám DB která udržuje např. seznam itemu v persistentních obchodech či truhlách je po nedlouhé době velikost DB řádově desítky MB přitom platných informací je tam řádově desítky kB.
Řešení problému:
1. SQL databázový server + NWNX – Neverwinter Nights Extender. NWNX – spouští na počítači další aplikaci tentokráte SQL server, což vám umožní téměř cokoliv, ale v případě malého množství dat (řádově kB) je tohle monstrum dost nevyužitý.
2. Přechrochtávač (copyright gGeorg), nástroj který kopíruje platné řádky do nové databáze a starou maže. V události OnModuleLoad projedu DB a zkopíruji si do pracovní databáze (déle jen DB_T) platné řádky. Pak DB smažu, dále vše z DB_T zkopíruji do nově vytvořené DB.
Důvod proč se ptám na to jestli je DB_T kompletní je ten že když založí nový hráč postavu a leknutím že nemá postavy modul zavře. Tím by mohlo dojít ke ztrátě dat.
Přechrochtávač nyní běhá na Demone asi 2 měsíce. Velikosti DB souboru jsou řádově jednotky kB. Lagy způsobené kynutím jsou pryč. Problémy vznikající tím že přerostlé DB jednou za čas smažu jsou taky pryč.
Tento systém vyrobil gGeorg a několika cennými zkušenostmi přispěl Lopyk.
Doporučení a rady:
- Databáze je pomalá pracujte v maximální možné míře s lokálními poměnnými.
- Některé perzistentní proměnné můžete ukládat do předmětů (například životy postav), ukládání dat je mnohem rychlejší, ale zas nedoporučujeme do předmětu ukládat velké množství proměnných.
Poznámka 26.2.2018:
- NWNx pro Neverwinter Nights: Enhanced Edition najdete Beamdog Forums
- NWN komunita navrhla vyměnit stávající BioWare databázi CodeBase za lepší, ale stále jednoduchou DB. Diskuze na toto téma probíhá v tématu The RFC builtin database replacement card discussion.
Pingback: WB review (první část) – Neverwinter CZ
Pingback: WB review (druhá část) – Neverwinter CZ