Doom engine

ID Tech 1
Typ Herní engine ( seznam )
Vývojář ID Software
Klíčový programátor John Carmack
Část řady motorů ID Tech
Předchozí motor série 3D engine Wolfenstein
Další motor v řadě Zemětřesný motor
Datum vydání 10. prosince 1993
Hardwarové platformy PC , Macintosh , Amiga , SNES , Sega 32X , Sega Saturn , 3DO , PlayStation , Game Boy Advance , Atari Jaguar a další
Podporovaný OS DOS , Linux , FreeBSD , jiné UNIXové
Napsáno jazykem C , jazyk symbolických instrukcí
Licence před rokem 1997 - Komerční software
po roce 1997 - Svobodný software : Licence GNU GPL
První hra na enginu Doom / 10. prosince 1993
Poslední hra na enginu Svár / 31. května 1996

Doom engine (“ Doom engine ”), také známý jako id Tech 1  , je pseudo- 3D herní engine vyvinutý americkou společností id Software a používaný v počítačových hrách Doom , Heretic , HeXen , Strife , HacX a dalších hrách vytvořených na základě licence . . Vytvořil John Carmack , pomocníky napsali Michael Abrash , John Romero , Dave Taylor a Paul Radek  . _ _ _ _ _ Původně psaný na počítačích NeXT , pak, pro první vydání, Doom byl portován k DOS , a později k několika herním konzolím a operačním systémům .    

Rozdíly od enginu Wolfenstein 3D

Omezení

Technické vlastnosti

Motor byl napsán v C na pracovních stanicích NeXT na operačním systému NEXTSTEP . Zpočátku byl použit kompilátor Intel C , ale později byl použit Watcom C . Nástroje byly napsány pod NeXT v Objective-C . Doom engine byl na svou dobu progresivní. Navzdory skutečnosti, že C je procedurální programovací jazyk, je Doom engine napsán v explicitním objektovém stylu.

Hladinové zařízení [1]

Všechny úrovně v Doomu jsou ve skutečnosti 2D, což naznačuje jedno z omezení enginu: je nemožné mít místnost (sektor) nad jinou místností. Nicméně na druhou stranu umožňuje bez problémů nakreslit mapu úrovní se všemi zobrazenými stěnami a objekty, na rozdíl od jiných her tohoto žánru.

Úroveň se skládá z deseti bloků .WAD-soubor; pět z nich ( VERTEXES, LINEDEFS, SIDEDEFSa ) je přímo editováno uživatelem, pět dalších ( , , a ) vypočítává SECTORStvůrce BSP. THINGSSEGSSSECTORSNODESREJECTBLOCKMAP

Úrovně jsou stavěny podle subtraktivního principu: veškerý prostor je zaplněn neprostupnou hmotou a autor levelu v této hmotě „prosekává“ tunely. Základem úrovně jsou vrcholy ( anglicky  vertices ) - body ve dvourozměrném prostoru. Mezi vrcholy se kreslí segmenty ( angl. linedefs ). Segment může mít jednu nebo dvě strany ( anglicky sidedefs ). Textury nejsou nastaveny pro segmenty, ale pro strany, takže segment lze pokrýt z různých stran různými texturami.   

Vrcholy a úsečky tvoří rovinný graf ; každá z jeho ploch může být buď neprostupný prostor (například sloup), nebo sektor ( anglicky  sektor ). Někdy je struktura sektorů záměrně narušena - na tom jsou založeny speciální efekty jako neviditelné mosty. Každý sektor má v půdorysu libovolný tvar (ne nutně konvexní nebo jednoduše spojený ). Sektor má vždy vodorovnou podlahu se stropem a konstantním osvětlením. Jednostranné sekce jsou prázdné stěny, oboustranné tvoří přechody mezi sektory.

Pro zajištění nejvyšší interaktivity v té době byly použity tzv. tagy . Segment a sektor mají speciální celočíselné pole - "tag". Pro vytvoření spínače, který spouští výtah, je segmentu spínače přidělen akční kód „spínač, který spouští výtah“ a nějaký štítek (například 5). Stejná značka je přiřazena k sektoru-elevator. Když je aktivován, segment provede zadanou akci na všech sektorech s touto značkou.

Nakonec jsou na úroveň umístěny předměty ( věci ). Zároveň se ukázalo, že sada vlastností objektů v Doomu byla dost špatná: například neexistovala souřadnice Z , pozemní objekt vždy na začátku hry stál na podlaze a vzdušný objekt visel na strop. Není možné, aby objekt byl pouze v singleplayeru , nebo pouze v deathmatch , nebo pouze v kooperaci (tam byla pouze vlajka "pouze v online hrách").

Hra

Všechny výpočty jsou prováděny s frekvencí 35 cyklů za sekundu, v pevném bodě 16,16, se strojovou jednotkou rovnou jednomu texelu (výška hráče je 56 texelů [2] [3]  - tedy 1 texel je přibližně roven 4 cm) . Pro úhlové hodnoty se používá pevný bod, ve kterém 2 32 = 360° [2] . Většina úhlových výpočtů však byla hrubší – například tahy hráče se počítají s přesností 360° = 2 16 = 65536 a trigonometrická tabulka se skládala pouze z 8192 (2 13 ) hodnot [2] .

Nahrávání ukázek a online hraní jsou založeny na skutečnosti, že na digitálním počítači vede stejný kód se stejnými daty ke stejnému výsledku a chování celočíselné aritmetiky je přísně specifikováno a nezávisí na modelu procesoru. Hra zaznamenává v demu (a přenáší po síti) ovládací příkazy [2] [4] [5] ; pokud ve hře nejsou žádné hrubé chyby, různé stroje, interpretující stejné ovládací příkazy, dostanou stejný výsledek. Ve hře se však stále vyskytují chyby, které vedou k desynchronizaci: zejména pokud vstoupíte do menu ve hře pro jednoho hráče, hra se zastaví, ale video se nadále píše [6] . Nevýhodou tohoto přístupu je nemožnost přetočit video; lze ji hrát pouze od začátku.

V režimu demo záznamu byla přesnost otáčení snížena na 256 o 360 stupňů [2] [7] ; Pozorný hráč si může všimnout, že v demo režimu je snímání hrubší. To slouží výhradně k úspoře paměti v ukázkách a bylo opraveno v mnoha portech za cenu ztráty kompatibility s původní hrou.

V každém herním cyklu (1/35 sekundy) hra prochází kontrolou každého monstra. Pro úsporu cyklů procesoru existuje bitová matice REJECT[8] : pro libovolné dva sektory, pokud není z žádného bodu sektoru A viditelný žádný bod sektoru B, je jeden nastaven na toto místo v matici. Pokud je průsečík řady odpovídající sektoru hráče a sloupce odpovídající sektoru nestvůry 0, je provedena kontrola, zda nestvůra hráče vidí; je-li 1, příšera hráče zaručeně neuvidí. Matici REJECTje velmi obtížné sestavit a většina vlastních editorů ji vyplnila nulami (bylo jen velmi málo nástrojů, které ji vytvořily; hlavní jsou RMBa ZENNODE).

Struktura BLOCKMAPje aplikována fyzikálním enginem pro urychlení kontroly kolizí objektů se segmenty.

Konstrukce obrazu

Pro urychlení zobrazení je použit BSP strom [9] (na rozdíl od portálů v Duke Nukem 3D ). Objekty jsou na rozdíl od Quake kresleny jako skřítci .

Motor prochází stromem BSP rekurzivně a kreslí stěny od nejbližší po nejvzdálenější [10] :

funkce treewalk(node). pokud EnclosingRectangle(uzel) není v kuželu pohledu pak odejděte pokud je uzel vidlice pak // uzel je vidlice - rekurzivně procházet pokud je kamera nalevo od roviny řezu potom Tree Pass(node.left); Tree Pass (uzel vpravo) jinak Tree Pass(node.right); Tree Pass (uzel vlevo) jinak // uzel je podsektor kreslit (uzel)

Zde se jedná o zbývající tři bloky. Sektory jsou rozděleny sečnami na konvexní prvky zvané podsektory ( SSECTORS), segmenty jsou rozděleny na segmenty ( SEGS). Samotná stromová struktura (zahrnující obdélníky, sečny, ukazatele na "syny") je uložena v bloku NODES. Tento cyklus kreslí pouze plné stěny (tj. střední textury pro jednostranné stěny a horní a spodní textury pro oboustranné). Objekty, patra a mřížky jsou zapsány do samostatných polí a vykresleny v pozdější fázi. Pole, které drží podlahy, je docela malé a je docela běžné, že amatérští konstruktéři přetečou a odejdou se zprávou " Už žádné viplany!" ".

Poté, co jsou stěny nakresleny, podlahy jsou nakresleny řádek po řádku, psané viplanes .

Každý sektor obsahuje propojený seznam objektů, které se v něm nacházejí. Ve fázi kreslení stěn jsou viditelné objekty spolu s ořezovými body přidány do pole. Poté, co motor nakreslí podlahy a stropy, je pole roztříděno a nejbližších 128 objektů je nakresleno od nejvzdálenějšího k nejbližšímu pomocí stejných postupů, jaké se používají pro kreslení stěn. Ve stejné fázi jsou také nakresleny mřížky („střední“ textury na oboustranných stěnách).

Textury stěn a sprite jsou uloženy v souboru .WAD po sloupcích, textury podlahy a stropu jsou jednoduché pole 64x64.

Doom pro DOS běžel v režimu VGA 320×200 [11] s trojitým ukládáním do vyrovnávací paměti , pro Linux  používal normální VGA 13h režim. V tomto případě byla hodnota rozlišení zakódována v procedurách assembleru na dvou místech; verze hry, které používaly proměnné rozlišení, měly buď více funkcí pro různá rozlišení [12], nebo dynamicky upravovaly kód tak, aby odpovídal požadovanému rozlišení [13] . V částech hry, které nepatří k enginu, však bylo mnoho magických čísel spojených s rozlišením obrazovky a souřadnicemi obrazovky různých objektů, takže první porty Doom trpěly grafikou menu, která se „šířila“ v SVGA. režimy [14] .

Dlouhé načítání

Doom je proslulý dlouhou dobou načítání (na počítačích své doby více než minuta). Většinu času strávila inicializace " Doom refresh daemon " ( eng. Init Doom refresh daemon ) .  

Doom byl distribuován na disketách a prostřednictvím BBS byl každý bajt důležitý. Pro zmenšení velikosti vyrobili takový mechanismus. Každá z textur na stěnách se skládala z fragmentů ( anglicky  patches ): například stěna s vypínačem se může skládat z obrázku stěny a obrázku vypínače nebo kachlová stěna - ze tří nebo čtyř náhodně rozmístěných dlaždic přes velkou texturu. Textury, jak je uvedeno výše, jsou kresleny ve sloupcích. Doom prošel všechny sloupce všech textur a zkontroloval, které fragmenty pokrývají konkrétní sloupec; byla vytvořena odpovídající datová struktura. Tato struktura by mohla být uložena v mezipaměti nebo postavena při načtení úrovně a dynamicky se budovat podle potřeby - v tomto případě by se Doom načítal mnohem rychleji [15] .

Kromě toho měl Doom specializovanou metodu ukládání dat do mezipaměti zvanou „zónová paměť“. Instrukce doporučovala zakázat diskové mezipaměti jako SmartDrive  - Doom má efektivnější mezipaměť.

Netcode

Doom je založen na modelu peer-to-peer . Jak již bylo zmíněno výše, synchronizace hry na všech strojích je zajištěna tím, že stejný kód se stejnými daty vrací stejný výsledek. S každým paketem je přenášena „synchronizační konvoluce“ – obvykle souřadnice jednoho z hráčů; pokud konvoluce přijatá s balíčkem neodpovídá místně vypočítané konvoluci, hra se zastaví a zobrazí se zpráva o nesynchronizaci. Neexistují žádné prostředky, jak čelit zpoždění přenosu; pokud průměrný ping překročí 1/35 sekundy, odezva hry na ovládání se zpomalí. Hra si může vyžádat ztracené pakety a duplikovat je tak, aby požadavky na opakovaný přenos byly co nejméně časté. Do započaté hry není vstup.

Podpora konkrétního síťového protokolu není součástí Doomu . Aby bylo možné hru spustit přes síť, hráči zavolají externí program – síťový ovladač , který naváže komunikaci mezi stroji a vyvolá soubor Doom .EXE . Tento design umožňuje psát externí ovladače pro jiné síťové protokoly – nebo síťové spouštěče Doom , které jsou pohodlnější než dostupné.

Každý z hráčů má jinou barvu: první je zelený, druhý šedý, třetí hnědý, čtvrtý červený. Čísla hráčů (a tedy i barvy) rozděluje síťový ovladač, nikoli hra. Ve hře přes IPX prostřednictvím programu IPXSETUPzávisí barvy přidělené hráčům na MAC adresách síťových karet , ve hře přes modem nebo kabel SERSETUP na náhodných faktorech.

Zajímavou nezdokumentovanou funkcí ve verzích 1.0 a 1.1 byla hra pro jednoho hráče na systému tří monitorů: jeden ukazuje, co je před hráčem, druhý je to, co je vlevo, třetí je to, co je vpravo. Protože v té době ještě neexistovaly grafické karty s tolika monitory, byly pro takovou hru potřeba tři počítače propojené sítí. Tato funkce však existovala pouze v plenkách: pro načtení z uložení bylo nutné hru restartovat na všech třech počítačích.

Seznam her využívajících Doom engine

Doom engine byl prodán jiným společnostem. Byla na něm vytvořena řada her. Mezi nimi:

Název hry datum vydání Vývojář/y Platformy
osud 1993 ID Software MS-DOS , Windows , Mac OS , Linux , Acorn Archimedes , SNES , Sega 32X , Sega Saturn , 3DO , PlayStation , Game Boy Advance , Atari Jaguar , Xbox , Xbox 360 , PlayStation 3 , iOS , Android
Doom II: Peklo na Zemi 1994 ID Software MS-DOS , Windows , Mac OS , Game Boy Advance , Sega Saturn , Tapwave Zodiac , PlayStation , Xbox 360 , PlayStation 3 , Android
Heretik 1994 Raven Software PC , PSX , MacOS , Amiga , GNU/Linux
Hexen 1995 Raven Software MS-DOS , Mac OS , Linux , PlayStation , Nintendo 64 , Sega Saturn
Final Doom 1996 idSoftware ,

Tým TNT, bratři Casaliové

MS-DOS , PlayStation , PlayStation 3 , MacOS
Svár 1996 Rogue Entertainment MS-DOS , Microsoft Windows , Linux , macOS
Chex Quest 1996 Digitální kavárna MS-DOS , Microsoft Windows
Chex Quest 2: Flemoids Take Chextropolis 1997 Digitální kavárna MS-DOS , Microsoft Windows
Doom 64 1997 hry uprostřed Nintendo 64
Hacx: Twitch 'n Kill 1997 Banjo Software MS-DOS , Microsoft Windows
Cruise'n Velocity 2001 Grafický stav Game Boy Advance
Temná aréna 2002 Grafický stav Game Boy Advance

Fanoušci hry také vytvořili vlastní úpravy , které hru zcela proměnily. První z nich - Alien Doom  - byl natočen podle filmu " Alien ". Následně se úpravy objevily na dalších filmech: „ Krotitelé duchů “, „ Batman “ a „ Akta X “. Viz Modding Doom .

Open source

V roce 1994 otevřeli zdrojové texty síťových ovladačů. Nadšenci začali vyvíjet vlastní ovladače: například pro LPT-kabel ( PARSETUP) a dokonce i pro COM-kabelový řetěz ( HX8).

V prosinci 1997 byl zveřejněn úplný zdrojový kód pro Doom pro Linux pod nesvobodnou, svobodnou licencí ( verze pro DOS nebyla zveřejněna kvůli placené zvukové knihovně DMX). Již v lednu 1998 se objevil první port tohoto kódu pro DOS  - DosDoom . Místo DMX bylo použito otevřené Allegro .

Průkopníky rozšíření Doom byli Lee Killow ( Boom  je rozšířená verze hry Doom , která opravila mnoho chyb původní hry), Denis Fabrice a Boris Pereira ( Doom Legacy ve vysokém rozlišení ) a Bruce Lewis ( glDoom , první port OpenGL zkázy ).

Po půl roce vývoje ukončilo glDoom selhání pevného disku Lewisova počítače : neexistovala žádná záloha . Z tohoto důvodu Carmack přelicencoval zdrojový kód pod GNU General Public License : pokud by licence nebyla tak omezující, někdo by zdrojový kód našel [16] . Zbytek prostředků zůstává zaplacen. Po 12 letech se našel zdrojový kód – od kamaráda, ke kterému Lewis šel s diskem.

V Doom [17] bylo nalezeno obrovské množství chyb . Fyzikální engine a renderer odlišně určovaly, zda je letadlo „nebeské“ nebo ne: raketa mohla zasáhnout oblohu a explodovat [18] , a naopak mohla „odletět“, aniž by explodovala prázdnou stěnou [19] . Nestvůry by uvízly ve dveřích [20] a Arch-Vile , vzkřísící rozdrcenou mrtvolu, ji současně učinil nezranitelnou a schopnou projít skrz zdi [21] . Porty obvykle kontrolovaly verzi dema : chyby byly zapnuty, pokud byl střih zaznamenán původní verzí hry, a vypnuty, pokud port. Takové chyby na některých uživatelských úrovních byly kritické pro průchod – proto je bylo možné v Boom a odvozených portech povolit prostřednictvím nabídky.

Nyní existuje několik desítek pokročilých verzí Doom  - od nejjednodušších až po extrémně výkonné. Umožňují vám hrát ve vyšším rozlišení než původní Doom , mají další funkce (pohled shora dolů, zaměřovací kříž) a také vylepšené online hraní . Nejznámější z těchto verzí jsou:

Doom Legacy , ZDoom a SkullTag mají schopnost hrát si s roboty .

Méně podstatné úpravy jsou stručně uvedeny v seznamu portů Doom her.

Datové soubory Doom zůstávají dodnes placené. Pro vytvoření zcela bezplatného souboru IWAD byl spuštěn projekt FreeDoom .

Poznámky

  1. Matthew Fell. The Unofficial Doom Specs v1.666…  (anglicky) ( HTML ) (15. prosince 1994). - Neoficiální specifikace Doom . Získáno 25. srpna 2011. Archivováno z originálu dne 2. dubna 2019.
  2. 1 2 3 4 5 Zdrojový kód pro Doom nebo rané porty (např. Doom Legacy 1.11, 1.12)
  3. Hráč  . _ DoomWiki.org. Získáno 8. dubna 2019. Archivováno z originálu dne 19. srpna 2019.
  4. Ukázka  _ _ DoomWiki.org. Získáno 8. dubna 2019. Archivováno z originálu dne 19. srpna 2019.
  5. Síťová komponenta  Doom . DoomWiki.org. Získáno 8. dubna 2019. Archivováno z originálu dne 19. srpna 2019.
  6. Desynchronizace ukázky způsobená přístupem do nabídky – The Doom Wiki – Doom, Doom 2, Doom 3 a další . Získáno 17. prosince 2018. Archivováno z originálu dne 8. dubna 2019.
  7. ↑ Při nahrávání ukázek  se sníží rozlišení otáčení . DoomWiki.org. Staženo 8. dubna 2019. Archivováno z originálu 8. dubna 2019.
  8. Odmítnout – The Doom Wiki – Doom, Doom 2, Doom 3 a další . Získáno 17. prosince 2018. Archivováno z originálu dne 24. srpna 2019.
  9. Vykreslovací engine Doom – The Doom Wiki – Doom, Doom 2, Doom 3 a další . Získáno 17. prosince 2018. Archivováno z originálu 19. srpna 2019.
  10. Vykreslovací engine Doom – The Doom Wiki – Doom, Doom 2, Doom 3 a další . Získáno 17. prosince 2018. Archivováno z originálu 19. srpna 2019.
  11. Doom Wiki: Poměr stran . Získáno 17. prosince 2018. Archivováno z originálu 15. července 2019.
  12. Zdrojový kód Smack My Marine Up
  13. Zdroj pro jakoukoli verzi Doom Legacy pro DOS , funkce ASM_PatchRowBytes.
  14. Například Doom Legacy 1.11, 1.12
  15. Mnoho portů Doom to dělá  , zejména Doom Legacy a Smack My Marine Up ; zdrojový kód obou je volně dostupný.
  16. Doom Wiki – Licence archivovány 18. prosince 2018 na Wayback Machine 
  17. Chyba enginu – The Doom Wiki – Doom, Doom 2, Doom 3 a další . Získáno 17. prosince 2018. Archivováno z originálu 19. srpna 2019.
  18. Projektily explodují při dopadu na „nebe“ – The Doom Wiki – Doom, Doom 2, Doom 3 a další . Datum přístupu: 17. prosince 2018. Archivováno z originálu 6. dubna 2016.
  19. Výstřely se neobjevují ve venkovních prostorách – The Doom Wiki – Doom, Doom 2, Doom 3 a další . Získáno 17. prosince 2018. Archivováno z originálu 3. dubna 2019.
  20. Příšery uvízlé ve dveřích, zdech nebo visících z výtahů – The Doom Wiki – Doom, Doom 2, Doom 3 a další . Získáno 17. prosince 2018. Archivováno z originálu 13. července 2019.
  21. Ghost monster – The Doom Wiki – Doom, Doom 2, Doom 3 a další . Získáno 17. prosince 2018. Archivováno z originálu dne 29. října 2019.