SQLDoom: „Doom“ kadrus 640×480 raiška generuoja CedarDB duomenų bazė naudodama 1300 eilučių SQL užklausų

SQLDoom: „Doom“ kadrus 640×480 raiška generuoja CedarDB duomenų bazė naudodama 1300 eilučių SQL užklausų

1 300 SQL užklausų eilučių sukuria tikslius bitmap vaizdus iš pragaro 35 kadrų per sekundę greičiu.

„Doom atvaizdavimas duomenų bazėje akivaizdžiai yra bloga idėja“, – rašo Lukas Vogel išsamiame tinklaraščio įraše, kuriame aiškina, kaip tiksliai jam pavyko atvaizduoti Doom naudojant SQL duomenų bazę.

Gerai, tai ne visai tikslu. Projektas SQLDoom naudoja nedidelį Python klientą, kuris apdoroja įvestį ir išvestį, valdo žaidimo laiką ir rodo kiekvieną kadrą ekrane. Už jo CedarDB lentelės seka žaidimo geometriją ir būseną, o apie 1 300 SQL užklausų eilučių, išskirstytų per 89 bendrąsias lentelių išraiškas (common table expressions), įgyvendina žaidimo logiką ir sukuria 35 bitmap kadrų buferius per sekundę.

Šiuo požiūriu SQLDoom yra didelis patobulinimas, palyginti su ankstesniu Vogelio projektu DoomQL, kuriuo pernai buvo siekiama sukurti „daugelio žaidėjų šaudyklę, panašią į Doom, visiškai SQL kalba“. Deja, tada pavyko sukurti tik spindulių sekimu (raycasting) paremtą pilkų atspalvių ASCII grafiką, labiau panašią į paprastus, 90 laipsnių kampų žemėlapius iš Wolfenstein 3D. O naujasis SQLDoom, priešingai, generuoja pilnaspalvius 640×480 kadrus, kurie atrodo taip, lyg būtų sukurti originalaus Doom vykdomojo failo.

Paaiškinimas: SQL yra standartinė kalba duomenims reliacinėse duomenų bazėse kurti, skaityti ir keisti. Paprastai ji naudojama informacijai saugoti ir filtruoti, o ne žaidimų vaizdui kurti.

Tai tik duomenys, žmogau

Klasikinius Doom WAD failus konvertuoti į reliacinę duomenų bazę buvo gana paprasta ir nesudėtinga, rašo Vogelis, nes originalus žaidimas lygius skaidė į viršūnes, linijas, sektorius ir panašiai. Net garsiuosius Doom dvejetainio erdvės skaidymo medžius (binary-space partition trees) galima išreikšti SQL, naudojant objektų rikiavimo raktą (sort_key), kuris kiekvienai pozicijai apskaičiuojamas iš anksto, įkeliant lygį. Kai tai nustatyta lentelėje, paprastas sakinys „ORDER BY“ gali kiekvienam kadrui nustatyti, kurias sienų dalis rodyti, o kurias ignoruoti, ir tai gerokai pagerina našumą.

Tačiau pereinant nuo SQL lentelės prie atvaizduotų pirmojo asmens kadrų iškilo keletas keblumų. Svarbiausias iš jų buvo grindų ir lubų atvaizdavimo algoritmas, kuris negali tiesiogiai pasinaudoti elegantiškais „visplanes“ ir būsenos pokyčiais, kuriais originaliame žaidime tai daroma stulpelis po stulpelio. SQLDoom atveju Vogelis naudoja, jo paties žodžiais, „gana šlykštų“ (angl. „pretty hacky“) pakaitalą, paremtą rūšiuoto plokštumų sąrašo apėjimu.

Nepaisant didelių papildomų sąnaudų, kylančių dėl to, kad viskas skaitoma iš SQL lentelių ir į jas rašoma, Vogelis teigė sugebėjęs paleisti DoomSQL maždaug 60 kadrų per sekundę greičiu nešiojamajame kompiuteryje su Ryzen 7 procesoriumi, o sudėtingose scenose kadrų dažnis retkarčiais nukrisdavo iki 35. Be to, nepaisant vargo verčiant Doom į SQL, Vogelis pabrėžia, kad stabili žaidimo būsenos „atskaitos momentinė kopija“ (reference snapshot) kartu su įgimtomis lygiagretumo ir prieigos valdymo galimybėmis suteikia didelių pranašumų paleidžiant daugelio žaidėjų serverį. Su duomenų baze nebūna „iš dalies pritaikytų atnaujinimų, fizikos klaidų ar ginčų dėl to, ar raketa tikrai pataikė“, sako Vogelis.

Jei norite paleisti „Doomtabase“ savo kompiuteryje, tai galite padaryti paprastai: pakanka kodo iš GitHub, CedarDB kopijos ir Doom WAD failo. Arba galite įsijungti į nemokamą internete talpinamą demonstracinį mačą ir išbandyti žaidimą be jokio paruošimo (nors naudodamas šią parinktį aš gavau gana prastą našumą). O kai tuo atsidžiaugsite, galbūt peržvelkite kai kuriuos iš daugybės kitų neįprastų Doom perkėlimų, apie kuriuos Ars rašė per pastaruosius metus.

Paaiškinimas: „Ar paleis Doom?“ yra seniai įsitvirtinusi programuotojų bendruomenės tradicija – bandyti paleisti šį klasikinį žaidimą kuo netikėtesnėje įrangoje ar programinėje aplinkoje, kad parodytų, jog tai įmanoma.

Daugiau

„Apple“ griežtina macOS visiško disko prieigos nustatymus dėl DI agentų keliamos rizikos

„Apple“ griežtina macOS visiško disko prieigos nustatymus dėl DI agentų keliamos rizikos