Doom motor

ID-teknik 1
Sorts Spelmotor ( lista )
Utvecklaren ID-programvara
Nyckelprogrammerare _ John Carmack
Del av en serie motorer ID Tech
Tidigare motor i serien Wolfenstein 3D-motor
Nästa motor i serien Quake motor
Utgivningsdatum 10 december 1993
Hårdvaruplattformar PC , Macintosh , Amiga , SNES , Sega 32X , Sega Saturn , 3DO , PlayStation , Game Boy Advance , Atari Jaguar och andra
OS som stöds DOS , Linux , FreeBSD , andra UNIX- liknande
Skrivet på språk C , assemblerspråk
Licens före 1997 - Kommersiell programvara
efter 1997 - Fri programvara : GNU GPL-licens
Första spelet på motorn Doom / 10 december 1993
Sista spelet på motorn Strife / 31 maj 1996

Doom engine (” Doom engine ”), även känd som id Tech 1  , är en pseudo -3D -spelmotor utvecklad av det amerikanska företaget id Software och används i datorspel Doom , Heretic , HeXen , Strife , HacX och andra spel skapade under licens . Hjälparna skapades av John Carmack och skrevs av Michael Abrash , John Romero , Dave Taylor och Paul Radek . _  _ _ Ursprungligen skriven på NeXT -datorer , sedan, för den första utgåvan, portades Doom till DOS och senare till flera spelkonsoler och operativsystem .    

Skillnader från Wolfenstein 3D-motorn

Begränsningar

Tekniska funktioner

Motorn skrevs i C på NeXT- arbetsstationer på operativsystemet NEXTSTEP . Till en början användes Intel C- kompilatorn , men senare användes Watcom C . Verktygen skrevs under NeXT i Objective-C . Doom -motorn var progressiv för sin tid. Trots att C är ett processuellt programmeringsspråk är Doom -motorn skriven i en explicit objektstil .

Nivåenhet [1]

Alla nivåer i Doom är faktiskt 2D, vilket indikerar en av motorns begränsningar: det är omöjligt att ha ett rum (sektor) ovanför ett annat rum. Men å andra sidan låter det dig rita en nivåkarta med alla väggar och föremål som visas utan problem, till skillnad från andra spel i denna genre.

Nivån består av tio block .WAD-fil; fem av dem ( VERTEXES, LINEDEFS, SIDEDEFS, SECTORSoch THINGS) redigeras direkt av användaren, ytterligare fem ( SEGS, SSECTORS, NODES, REJECToch BLOCKMAP) beräknas av BSP-byggaren.

Nivåer byggs enligt den subtraktiva principen: allt utrymme är fyllt med ogenomtränglig materia, och författaren till nivån "skär igenom" tunnlar i denna fråga. Grunden för nivån är hörn ( engelska  hörn ) - punkter i tvådimensionellt utrymme. Segment ritas mellan hörnen ( eng. linedefs ). Ett segment kan ha en eller två sidor ( engelska sidedefs ). Texturer ställs inte in för segment, utan för sidor, så att ett segment kan täckas från olika sidor med olika texturer.   

Topparna och linjesegmenten bildar en plan graf ; var och en av dess ytor kan vara antingen ett ogenomträngligt utrymme (till exempel en kolumn) eller en sektor ( engelska  sektorn ). Ibland kränks strukturen av sektorer medvetet - specialeffekter som osynliga broar bygger på detta. Varje sektor har en godtycklig form i plan (inte nödvändigtvis konvex eller helt enkelt ansluten ). Sektorn har alltid ett horisontellt golv med tak och konstant belysning. Ensidiga sektioner är tomma väggar, tvåsidiga bildar övergångar mellan sektorer.

För att säkerställa den högsta interaktiviteten vid den tiden användes de så kallade taggarna . Segmentet och sektorn har ett speciellt heltalsfält - "tagg". För att göra en växel som sänker hissen får växelsegmentet en åtgärdskod "omkopplare som sänker hissen" och någon tagg (till exempel 5). Samma tagg tilldelas sektorhissen. När det är aktiverat kommer segmentet att utföra den angivna åtgärden på alla sektorer med denna tagg.

Slutligen placeras föremål ( saker ) på nivån. Samtidigt visade sig uppsättningen av objektegenskaper i Doom vara ganska dålig: till exempel fanns det ingen Z -koordinat, ett markobjekt stod alltid på golvet i början av spelet och ett luftföremål hängde från taket. Det är omöjligt att få objektet att vara endast i single player , eller bara i deathmatch , eller bara i co-op (det fanns bara en flagga "bara i onlinespel").

Spel

Alla beräkningar utförs med en frekvens av 35 cykler per sekund, i en fast punkt på 16,16, med en maskinenhet lika med en texel (spelarens höjd är 56 texel [2] [3]  - så 1 texel är ungefär lika med 4 centimeter) . För vinkelvärden används en fast punkt, där 2 32 = 360° [2] . De flesta av vinkelberäkningarna var dock grovare - till exempel beräknas spelarens varv med en noggrannhet på 360° = 2 16 = 65536, och den trigonometriska tabellen bestod av endast 8192 (2 13 ) värden [2] .

Inspelning av demos och onlinespel baseras på det faktum att på en digital dator leder samma kod med samma data till samma resultat, och beteendet för heltalsaritmetik är strikt specificerat och beror inte på processormodellen. Spelet spelar in i demon (och sänder över nätverket) kontrollkommandon [2] [4] [5] ; om det inte finns några grova fel i spelet får olika maskiner, som tolkar samma kontrollkommandon, samma resultat. Det finns dock fortfarande fel i spelet som leder till avsynkronisering: i synnerhet om du går in i menyn i ett enspelarspel stoppas spelet, men videon fortsätter att skrivas [6] . Nackdelen med detta tillvägagångssätt är oförmågan att spola tillbaka videon; det kan bara spelas från början.

I demoinspelningsläge reducerades rotationsnoggrannheten till 256 med 360 grader [2] [7] ; En uppmärksam spelare kan märka att i demoläget blir pickupen grövre. Detta tjänar enbart till att spara minne i demos och har fixats i många portar till priset av att förlora kompatibiliteten med originalspelet.

Varje spelcykel (1/35 av en sekund) cyklar spelet genom kontrollen av varje monster. För att spara processorcykler finns det en bitmatris REJECT[8] : för två godtyckliga sektorer, om ingen punkt i sektor B är synlig från någon punkt i sektor A, sätts en på denna plats i matrisen. Om skärningspunkten mellan raden som motsvarar spelarens sektor och kolumnen som motsvarar monstrets sektor är 0, görs en kontroll för att se om monstret ser spelaren; om 1 kommer monstret garanterat att inte se spelaren. Matrisen REJECTär mycket svår att bygga, och de flesta anpassade redaktörer fyllde den med nollor (det var väldigt få verktyg som byggde den; de viktigaste är RMBoch ZENNODE).

Strukturen BLOCKMAPtillämpas av fysikmotorn för att påskynda kontrollen av objektkollisioner med segment.

Bildkonstruktion

För att snabba upp visningen används ett BSP- träd [9] (till skillnad från portaler i Duke Nukem 3D ). Objekt ritas som sprites , till skillnad från Quake .

Motorn korsar BSP-trädet rekursivt och drar väggar från närmaste till längsta [10] :

treewalk(nod) funktion om EnclosingRectangle(noden) inte finns i vykonen avsluta sedan om noden är en gaffel sedan // är noden en gaffel - rekursivt korsa om kameran är till vänster om skärplanet sedan Trädpass(nod.vänster); Trädpass (nodhöger) annars Tree Pass(node.right); Trädpass (nod till vänster) annars // är noden en undersektor rita (knut)

De återstående tre blocken är inblandade här. Sektorer delas in med sekanter i konvexa element som kallas undersektorer ( SSECTORS), segment är indelade i segment ( SEGS). Själva trädstrukturen (som omfattar rektanglar, sekanter, pekare till "söner") lagras i ett block NODES. Denna cykel ritar endast solida väggar (dvs medelstora texturer för enkelsidiga väggar och topp- och bottentexturer för dubbelsidiga). Objekt, golv och rutnät skrivs till separata arrayer och ritas i ett senare skede. Arrayen som håller golven är gjord ganska liten, och det är ganska vanligt att amatörkonstruktörer svämmar över och lämnar meddelandet " Inga fler visplanes!" ".

Efter att väggarna har ritats ritas golven rad för rad, skrivna med visplanes .

Varje sektor har en länkad lista över objekt som finns i den. I stadiet för att rita väggarna läggs de synliga föremålen, tillsammans med skärpunkterna, till en array. Efter att motorn har ritat golv och tak, sorteras arrayen och de närmaste 128 objekten ritas från längst till närmaste med samma procedurer som används för att rita väggar. I samma skede ritas även galler ("medium" texturer på dubbelsidiga väggar).

Väggtexturer och sprites lagras i en .WAD -fil efter kolumner, golv- och taktexturer är en enkel 64x64-array.

Doom för DOS körde i VGA 320×200 [11] -läge med trippelbuffring , för Linux  använde det normalt VGA 13h-läge. I det här fallet kodades upplösningsvärdet i assemblerprocedurer på två ställen; versioner av spelet som använde variabel upplösning hade antingen flera funktioner för olika upplösningar [12] eller modifierade dynamiskt koden för att matcha den nödvändiga upplösningen [13] . Men i delar av spelet som inte tillhör motorn fanns det många magiska siffror förknippade med skärmupplösning och skärmkoordinater för olika objekt, så de första portarna i Doom led av menygrafik som "spreds" i SVGA lägen [14] .

Lång laddning

Doom är ökänt för sina långa laddningstider (mer än en minut på dagens datorer). Den mesta tiden ägnades åt att initiera " Doom refresh daemon " ( eng. Init Doom refresh daemon ) .  

Doom distribuerades på disketter och via BBS var varje byte viktig. För att minska storleken gjorde de en sådan mekanism. Var och en av väggarnas strukturer bestod av fragment ( engelska  patches ): till exempel kan en vägg med en strömbrytare bestå av en bild av en vägg och en bild av en strömbrytare, eller en kaklad vägg - av tre eller fyra plattor slumpmässigt utspridda över en stor textur. Texturer, som nämnts ovan, ritas i kolumner. Doom gick igenom alla kolumner i alla texturer och kontrollerade vilka fragment som täckte en viss kolumn; motsvarande datastruktur byggdes. Denna struktur kunde cachelagras eller byggas när nivån laddades, bygga dynamiskt efter behov - i detta fall skulle Doom laddas mycket snabbare [15] .

Dessutom hade Doom en specialiserad datacachningsmetod som kallas " zonerat minne". Instruktionen rekommenderade att inaktivera diskcacher som SmartDrive  - Doom har en mer effektiv cache.

Netcode

Doom bygger på peer-to-peer- modellen . Som nämnts ovan säkerställs synkroniseringen av spelet på alla maskiner genom att samma kod med samma data returnerar samma resultat. Med varje paket sänds en "synkfalsning" - vanligtvis koordinaten för en av spelarna; om faltningen som tas emot med paketet inte matchar den lokalt beräknade, stoppas spelet med ett osynkroniserat meddelande. Det finns inget sätt att motverka överföringsförseningar; om den genomsnittliga pingen överstiger 1/35 av en sekund, saktar spelets svar på kontroller ned. Spelet kan begära förlorade paket och duplicera dem så att återsändningsförfrågningar sker så sällan som möjligt. Det finns ingen inträde till det startade spelet.

Stöd för ett visst nätverksprotokoll ingår inte i Doom . För att köra spelet över ett nätverk anropar spelare ett externt program - en nätverksdrivrutin som upprättar kommunikation mellan maskiner och anropar Doom .EXE-filen . Denna design låter dig skriva externa drivrutiner för andra nätverksprotokoll - eller Doom -nätverksstartare som är mer bekväma än de som finns tillgängliga.

Varje spelare har olika färger: den första är grön, den andra är grå, den tredje är brun, den fjärde är röd. Spelarnummer (och därmed färger) distribueras av nätverksdrivrutinen, inte av spelet. I spelet över IPX genom programmet IPXSETUPberor färgerna som spelarna får på MAC-adresserna för nätverkskort , i spelet över ett modem eller kabelgenomföring SERSETUP på slumpmässiga faktorer.

En intressant odokumenterad funktion i version 1.0 och 1.1 var ett enspelarspel på ett system med tre skärmar: en visar vad som finns framför spelaren, den andra är vad som finns till vänster, den tredje är vad som finns till höger. Eftersom grafikkort med så många bildskärmar inte fanns på den tiden, behövdes tre datorer sammankopplade med ett nätverk för ett sådant spel. Den här funktionen existerade dock bara i sin linda: för att ladda från en lagring krävdes det att starta om spelet på alla tre datorerna.

Lista över spel som använder Doom-motorn

Doom -motorn såldes till andra företag. Ett antal spel har gjorts på den. Bland dem:

Namnet på spelet Utgivningsdatum Utvecklare/er Plattformar
undergång 1993 ID-programvara 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: Helvete på jorden 1994 ID-programvara MS-DOS , Windows , Mac OS , Game Boy Advance , Sega Saturn , Tapwave Zodiac , PlayStation , Xbox 360 , PlayStation 3 , Android
Kättare 1994 Raven programvara PC , PSX , MacOS , Amiga , GNU/Linux
Hexen 1995 Raven programvara MS-DOS , Mac OS , Linux , PlayStation , Nintendo 64 , Sega Saturn
Final Doom 1996 idSoftware ,

Team TNT, bröderna Casali

MS-DOS , PlayStation , PlayStation 3 , MacOS
Kiv 1996 Rogue underhållning MS-DOS , Microsoft Windows , Linux , macOS
Chex Quest 1996 Digitalt café MS-DOS , Microsoft Windows
Chex Quest 2: Flemoids Take Chextropolis 1997 Digitalt café MS-DOS , Microsoft Windows
Doom 64 1997 mellanspel Nintendo 64
Hacx: Twitch 'n Kill 1997 Banjo programvara MS-DOS , Microsoft Windows
Cruise'n Velocity 2001 Grafiskt tillstånd Game Boy Advance
Dark Arena 2002 Grafiskt tillstånd Game Boy Advance

Dessutom skapades anpassade modifieringar av fans av spelet , vilket helt förvandlade spelet. Den första av dem - Alien Doom  - gjordes baserad på filmen " Alien ". Därefter dök ändringar upp på andra filmer: " Ghostbusters ", " Batman " och " The X-Files ". Se Modding Doom .

Öppen källkod

1994 öppnade de källtexterna för nätverksdrivrutiner. Entusiaster började utveckla sina egna drivrutiner: till exempel för LPT-kabel ( PARSETUP) och till och med för COM-kabelkedja ( HX8).

I december 1997 publicerades den fullständiga källkoden för Doom för Linux under en icke-fri, gratis licens ( DOS - versionen publicerades inte på grund av det betalda DMX-ljudbiblioteket). Redan i januari 1998 dök den första porten av denna kod för DOS upp  - DosDoom . Istället för DMX användes en öppen Allegro .

Pionjärerna för Doom -expansionen var Lee Killow ( Boom  är en utökad version av Doom som fixade många av originalspelets buggar), Denis Fabrice och Boris Pereira ( högupplöst Doom Legacy ), och Bruce Lewis ( glDoom , den första OpenGL - porten av Doom ).

Efter ett halvt års utveckling satte felet på hårddisken på Lewis dator slut på glDoom : det fanns ingen backup . På grund av detta återlicensierade Carmack källkoden under GNU General Public License : om licensen inte var så restriktiv skulle någon ha hittat källkoden [16] . Resten av resurserna förblir betalda. Efter 12 år hittades källkoden - från en vän som Lewis gick med en disk till.

Ett stort antal buggar har hittats i Doom [17] . Fysikmotorn och renderaren avgjorde olika om planet var "himmelskt" eller inte: en raket kunde träffa himlen och explodera [18] , och vice versa, den kunde "flyga iväg" utan att explodera genom en tom vägg [19] . Monster skulle fastna i dörrar [20] , och Arch-Vile , som återupplivade ett krossat lik, gjorde det samtidigt osårbart och kunde passera genom väggar [21] . Portar kontrollerade vanligtvis versionen av demon : buggar aktiverades om klippet spelades in av den ursprungliga versionen av spelet, och stängdes av om av porten. Sådana fel på vissa användarnivåer var kritiska för att passera - därför kunde de aktiveras via menyn i Boom- och derivatportar.

Nu finns det flera dussin avancerade versioner av Doom  – från de enklaste till extremt kraftfulla. De låter dig spela med en högre upplösning än den ursprungliga Doom , har ytterligare funktioner (vy upp och ner, hårkors), samt förbättrat onlinespel . De mest kända av dessa versioner är:

Doom Legacy , ZDoom och SkullTag har möjligheten att spela med bots .

Mindre betydande ändringar listas kort i listan över portar i Doom-spel.

Doom-datafiler förblir betalda till denna dag. För att skapa en helt gratis IWAD -fil startades FreeDoom- projektet .

Anteckningar

  1. Matthew Fell. The Inofficial Doom Specs v1.666...  ​​(engelska) ( HTML ) (15 december 1994). - Inofficiell Doom -specifikation . Hämtad 25 augusti 2011. Arkiverad från originalet 2 april 2019.
  2. 1 2 3 4 5 Källkod för Doom eller tidiga portar (t.ex. Doom Legacy 1.11, 1.12)
  3. Spelare  . _ DoomWiki.org. Hämtad 8 april 2019. Arkiverad från originalet 19 augusti 2019.
  4. Demo  . _ DoomWiki.org. Hämtad 8 april 2019. Arkiverad från originalet 19 augusti 2019.
  5. Doom nätverkskomponent  . DoomWiki.org. Hämtad 8 april 2019. Arkiverad från originalet 19 augusti 2019.
  6. Demo-avsynkronisering orsakad av menyåtkomst - Doom Wiki - Doom, Doom 2, Doom 3 och mer . Hämtad 17 december 2018. Arkiverad från originalet 8 april 2019.
  7. ↑ Vridningsupplösningen sänks vid inspelning av demos  . DoomWiki.org. Hämtad 8 april 2019. Arkiverad från originalet 8 april 2019.
  8. Reject - The Doom Wiki - Doom, Doom 2, Doom 3 och mer . Hämtad 17 december 2018. Arkiverad från originalet 24 augusti 2019.
  9. Doom-renderingsmotor - The Doom Wiki - Doom, Doom 2, Doom 3 och mer . Hämtad 17 december 2018. Arkiverad från originalet 19 augusti 2019.
  10. Doom-renderingsmotor - The Doom Wiki - Doom, Doom 2, Doom 3 och mer . Hämtad 17 december 2018. Arkiverad från originalet 19 augusti 2019.
  11. Doom Wiki: Bildförhållande . Hämtad 17 december 2018. Arkiverad från originalet 15 juli 2019.
  12. Smack My Marine Up -källkod
  13. Källa för valfri DOS-version av Doom Legacy , ASM_PatchRowBytes-funktion.
  14. Till exempel Doom Legacy 1.11, 1.12
  15. Många hamnar i Doom gör detta  , särskilt Doom Legacy och Smack My Marine Up ; källkoden för båda är fritt tillgänglig.
  16. Doom Wiki - Licenser arkiverade 18 december 2018 på Wayback Machine 
  17. Engine bug - The Doom Wiki - Doom, Doom 2, Doom 3 och mer . Hämtad 17 december 2018. Arkiverad från originalet 19 augusti 2019.
  18. Projektiler exploderar vid nedslag med "himlen" - The Doom Wiki - Doom, Doom 2, Doom 3 och mer . Datum för åtkomst: 17 december 2018. Arkiverad från originalet den 6 april 2016.
  19. Bullet puffs förekommer inte i utomhusområden - The Doom Wiki - Doom, Doom 2, Doom 3 och mer . Hämtad 17 december 2018. Arkiverad från originalet 3 april 2019.
  20. Monster som fastnat i dörrspår, väggar eller hängande utanför hissar - The Doom Wiki - Doom, Doom 2, Doom 3 och mer . Hämtad 17 december 2018. Arkiverad från originalet 13 juli 2019.
  21. Spökmonster - The Doom Wiki - Doom, Doom 2, Doom 3 och mer . Hämtad 17 december 2018. Arkiverad från originalet 29 oktober 2019.