Doom engine | это... Что такое Doom engine? (original) (raw)

Последняя игра на движке

псевдотрёхмерный игровой движок, разработанный американской компанией id Software и применяемый в компьютерных играх Doom, Heretic, HeXen, HacX и других играх, созданных лицами, имеющими патент. Создан Джоном Кармаком, вспомогательные функции были написаны Майком Абрашем (англ. Mike Abrash), Джоном Ромеро (англ. John Romero), Дэйвом Тэйлором (англ. Dave Taylor и Полом Райдеком (англ. Paul Radek). Первоначально написан на компьютерах NeXT, затем, для первого релиза Doom был портирован под DOS, а позднее ещё на несколько игровых консолей и операционных систем.

Содержание

Отличия от Wolfenstein 3D engine

Ограничения

Технические особенности

Движок был написан на Си на рабочих станциях NeXT в операционной системе NEXTSTEP. Изначально использовался компилятор Intel C, но в дальнейшем был использован Watcom C. Утилиты были написаны под NeXT на Objective-C. Движок Doom был прогрессивным для своего времени. Несмотря на то, что Си — язык процедурного программирования, движок Doom написан в явно выраженном объектном стиле.

Устройство уровней[1]

Внутреннее представление уровня Doom

Уровень в редакторе

Вид в игре

Все уровни в Doom на самом деле двухмерные, что указывает на одно из ограничений движка: невозможно иметь комнату (сектор) над другой комнатой. Однако, с другой стороны, это позволяет без особых проблем рисовать карту уровня с отображением всех стен и объектов, в отличие от других игр этого жанра.

Уровень состоит из десяти блоков [.WAD](1414443)-файла; из них пять (VERTEXES, LINEDEFS, SIDEDEFS, SECTORS и THINGS) непосредственно редактируются пользователем, ещё пять (SEGS, SSECTORS, NODES, REJECT и BLOCKMAP) — вычисляются BSP-построителем.

Уровни строятся по субтрактивному принципу: всё пространство заполнено непроходимой материей, и автор уровня «прорубает» в этой материи туннели. Основой уровня являются вершины (англ. vertices) — точки в двухмерном пространстве. Между вершинами проводятся отрезки (англ. linedefs). Отрезок может иметь одну или две стороны (англ. sidedefs). Текстуры задаются не для отрезков, а для сторон, так что отрезок может быть покрыт с разных сторон разными текстурами.

Вершины и отрезки образуют плоский граф; каждая его грань может быть или непроходимым пространством (например, колонной) или сектором (англ. sector). Иногда структуру секторов намеренно нарушают — на этом основаны спецэффекты наподобие невидимых мостов. Каждый сектор имеет в плане произвольную форму (не обязательно выпуклую или односвязную). У сектора всегда горизонтальные пол с потолком и постоянная освещённость. Односторонние отрезки являются глухими стенами, двусторонние — образуют переходы между секторами.

Чтобы обеспечить высочайшую на то время интерактивность, применены так называемые теги. Отрезок и сектор имеют особое целое поле — «тэг». Чтобы сделать выключатель, опускающий лифт, отрезку-выключателю задаются код действия «выключатель, опускающий лифт» и какой-нибудь тег (например, 5). Этот же тег присваивается сектору-лифту. При активации отрезок будет выполнять указанное действие на всех секторах с этим тегом.

Наконец, на уровне расставляются объекты (things). При этом набор характеристик объекта в Doom оказался довольно беден: например, не было _Z_-координаты, наземный объект в начале игры всегда стоял на полу, а воздушный — висел под потолком. Нельзя сделать, чтобы объект был только в одиночной игре, или только в deathmatch, или только в кооперативной (был лишь флаг «только в сетевых играх»).

Игра

Все вычисления проводятся в фиксированной запятой 16,16, с машинной единицей, равной одному текселю (рост игрока 56 текселей[2][3] — значит, 1 тексель примерно равен 3 см). Для угловых величин применяется фиксированная запятая, в которой 232 = 360°[2]. Впрочем, большинство угловых расчётов были грубее — например, повороты игрока рассчитываются с точностью в 360° = 216 = 65536, а тригонометрическая таблица состояла всего из 8192 (213) величин[2].

Запись демо-роликов и сетевая игра основаны том, что на цифровой ЭВМ один и тот же код с одними и теми же данными приводит к одному и тому же результату, а поведение целочисленной арифметики жёстко заспецифицировано и не зависит от модели процессора. Игра записывает в демо-ролик (и передаёт по сети) команды управления[2][4][5]; если в игре нет грубых ошибок, различные машины, интерпретируя одни и те же команды управления, получают один и тот же результат. Впрочем, ошибки, приводящие к рассинхронизации, в игре всё-таки есть: в частности, если в одиночной игре зайти в меню, игра останавливается, но ролик продолжает писаться[6]. Недостаток такого подхода — невозможность перемотать ролик; его можно только проиграть с начала.

В режиме записи демо-роликов точность поворотов снижалась до 256 на 360 градусов[2][7]; внимательный игрок может заметить, что в режиме демозаписи наводка становится грубее. Это служит исключительно для экономии памяти в демо-роликах.

Каждый игровой такт (1/35 секунды) игра проводит цикл управления каждым монстром. Для того, чтобы сэкономить процессорные такты, существует битовая матрица REJECT[8]: для любых двух секторов, если ни из одной точки сектора А не видна никакая точка сектора Б, на этом месте в матрице ставится единица. Если на пересечении строки, соответствующей сектору игрока, и столбца, соответствующего сектору монстра, стоит 0, проводится проверка, видит ли монстр игрока; если 1 — монстр гарантированно не видит игрока. Матрица REJECT очень сложна для построения, и большинство пользовательских редакторов заполняли её нулями (существовало очень мало утилит, которые строили её; основные — RMB и ZENNODE).

Структура BLOCKMAP применяется физическим движком, чтобы ускорить проверку столкновений объектов с отрезками.

Рендеринг

Для ускорения отображения используется BSP-дерево[9] (в отличие от порталов в Duke Nukem 3D). Объекты изображаются в виде спрайтов, в отличие от Quake.

Движок рекурсивно проходится по BSP-дереву, отрисовывая стены от ближних к дальним[10]:

функция ПроходПоДереву(узел)

если ОхватывающийПрямоугольник(узел) не в конусе видимости то выход

если узел является развилкой

 то   // узел является развилкой - рекурсивно пройти
   если камера слева от секущей плоскости
     то ПроходПоДереву(узел.левый); ПроходПоДереву(узел.правый)
     иначе ПроходПоДереву(узел.правый); ПроходПоДереву(узел.левый)

 иначе // узел является подсектором
   нарисовать(узел)

Здесь и задействованы оставшиеся три блока. Секторы разбиваются секущими на выпуклые элементы, именуемые подсекторами (SSECTORS), отрезки — на сегменты (SEGS). Сама структура дерева (охватывающие прямоугольники, секущие, указатели на «сыновей») хранится в блоке NODES. В этом цикле рисуются только глухие стены (то есть, средние текстуры для односторонних стен, и верхние и нижние — для двусторонних). Объекты, полы и решётки записываются в отдельные массивы и отрисовываются на более поздних стадиях. Массив, в котором хранятся полы, сделан довольно малым, и у самодеятельных конструкторов довольно часто случалось переполнение и выход с сообщением «_No more visplanes!_».

После того, как отрисованы стены, по строкам рисуются полы, записанные в visplanes.

В каждом секторе держится связанный список объектов, которые находятся в нём. На этапе прорисовки стен видимые объекты вместе с точками отсечки складываются в массив. После того, как движок нарисует полы и потолки, массив сортируется, и ближайшие 128 объектов рисуются от дальних к ближним с помощью тех же процедур, что используются для рисования стен. На этом же этапе рисуются и решётки («средние» текстуры на двусторонних стенах).

Текстуры стен и спрайты хранятся в .WAD-файле по столбцам, текстуры полов и потолков — простой массив 64×64.

Doom для DOS работал в режиме VGA 320×200[11] с тройной буферизацией, для Linux — использовал обычный режим VGA 13h. При этом величина разрешения была закодирована в ассемблерных процедурах в двух местах; версии игры, которые использовали переменное разрешение, либо имели несколько функций под разные разрешения[12], либо динамически модифицировали код, подставляя нужное разрешение[13][_неавторитетный источник?_]. Впрочем, в частях игры, которые к движку не относятся, встречалось крайне много магических чисел, связанных с разрешением экрана и экранными координатами различных объектов, поэтому первые порты Doom страдали «расползающейся» в SVGA-режимах графикой меню[14].

Длительная загрузка

Doom известен своей длительной загрузкой (больше минуты на компьютерах своего времени). Основная часть времени тратилась на инициализацию «демона перерисовки _Doom_» (англ. Init Doom refresh daemon).

Doom распространялся на дискетах и через BBS, важен был каждый байт. Чтобы уменьшить размер, сделали такой механизм. Каждая из текстур для стен состояла из фрагментов (англ. patches): например, стена с выключателем может состоять из картинки стены и картинки выключателя, или плиточная стена — из трёх-четырёх плиток, хаотически разбросанных по большой текстуре. Текстуры, как сказано выше, рисуются по столбцам. Doom проходился по всем столбцам всех текстур и проверял, какие фрагменты покрывают тот или иной столбец; строилась соответствующая структура данных. Эту структуру можно было закэшировать, или строить при загрузке уровня, достраивая динамически по мере надобности — в этом случае Doom загружался бы намного быстрее[15].

Сетевой код

Doom основан на модели «равный с равным». Как было сказано выше, синхронность игры на всех машинах обеспечивается тем фактом, что один и тот же код с одними и теми же данными возвращает один и тот же результат. С каждым пакетом передаётся «свёртка синхронизации» — обычно координата одного из игроков; если полученная с пакетом свёртка не совпадает с локально вычисленной, игра прекращает работу с сообщением о рассинхронизации. Никаких средств противостояния задержкам передачи нет; если средний пинг превышает 1/35 секунды, замедляется реакция игры на управление. Игра может запрашивать потерянные пакеты и дублировать их, чтобы запросы повторной передачи шли как можно реже. Входа в начатую игру нет.

Поддержка того или иного сетевого протокола не включена в Doom. Для того, чтобы запустить игру по сети, игроки вызывают внешнюю программу — сетевой драйвер, который налаживает связь между машинами и вызывает .EXE-файл Doom. Такая конструкция позволяет писать внешние драйверы для других сетевых протоколов — или программы запуска Doom’а по сети, более удобные, чем имеющиеся.

Каждый из игроков имеет свой цвет: первый — зелёный, второй — серый, третий — коричневый, четвёртый — красный. Номера игроков (и, соответственно, цвета) раздаются сетевым драйвером, а не игрой. В игре по IPX через программу IPXSETUP отдаваемые игрокам цвета зависят от MAC-адресов сетевых плат, в игре по модему или кабелю через SERSETUP — от случайных факторов.

Интересной недокументированной функцией версий 1.0 и 1.1 была одиночная игра на трёхмониторной системе: один показывает то, что спереди от игрока, второй — то, что слева, третий — то, что справа. Поскольку видеоплат с таким количеством мониторов на то время не существовало, для такой игры нужны были три компьютера, соединённых сетью. Впрочем, эта функция существовала лишь в зачатке: чтобы загрузиться с сохранения, требовалось на всех трёх компьютерах перезапустить игру.

Игры на движке Doom

Движок Doom продавался другим компаниям. На нём был сделан ряд игр. Среди них:

Также фанатами игры создавались пользовательские моды, полностью преображавшие игру. Первый из таких модов — Alien Doom — был сделан по фильму «Чужой». Впоследствии появились моды и по другим фильмам: «Охотники за привидениями», «Бэтмен» и «Секретные материалы». См. Моддинг Doom’a.

Открытие исходного кода

В 1994 году открыли исходные тексты сетевых драйверов. Энтузиасты начали разрабатывать собственные драйверы: например, для LPT-кабеля (PARSETUP) и даже для цепочки COM-кабелей (HX8).

В декабре 1997 года случилась беспрецедентная (на то время)[источник не указан 133 дня], акция: полный исходный текст Doom для Linux был опубликован под несвободной бесплатной лицензией (версия для DOS не публиковалась из-за платной звуковой библиотеки DMX). Чи Хоан (англ. Chi Hoang) был первым)[источник не указан 133 дня], , кто сумел в январе 1998 года выпустить порт Doom для DOSDosDoom.

Пионерами расширения Doom были Ли Киллоу (Boom — расширенная версия Doom, в которой были исправлены все ошибки оригинальной игры, а также серьёзно, почти в 1,5 раза, был ускорен движок))[источник не указан 133 дня], Денис Фабрис и Борис Перейра (Doom Legacy — версия Doom с качественным пользовательским интерфейсом)[источник не указан 133 дня] и поддержкой высоких разрешений), а также Брюс Льюис — создал glDoom, первый порт Doom под OpenGL.

После полугода разработки авария на жёстком диске Льюиса поставила крест на glDoom: резервной копии не было. Из-за этого Кармак перелицензировал исходные тексты под GNU General Public License: если бы лицензия не была такой ограничивающей, исходный текст обязательно нашёлся бы у кого-то[16]. Остальные ресурсы так и остаются платными.

В Doom было найдено огромное количество ошибок[17]. Физический движок и рендерер по-разному определяли, является плоскость «небесной» или нет: ракета могла ударить в небо и взорваться[18], и наоборот, могла «улететь», не взрываясь, через глухую стену[19]. Монстры застревали в дверях[20], а Arch-Vile, воскрешая раздавленный труп, одновременно делал его неуязвимым и способным проходить через стены[21]. Обычно порты проверяли версию демо-ролика: ошибки включались, если ролик записан исходной версией игры, и выключались, если портом. Подобные ошибки на некоторых пользовательских уровнях были критичны для прохождения — поэтому в Boom и производных портах их можно было включить через меню.

Сейчас существует несколько десятков расширенных версий Doom — от простейших до чрезвычано мощных. Они позволяют играть с более высоким разрешением, чем оригинальный Doom, имеют дополнительные возможности (обзор вверх-вниз, перекрестие прицела), а также расширенную сетевую игру. Наиболее известные из этих версий:

В Doom Legacy, ZDoom и SkullTag присутствует возможность игры с ботами.

Менее значимые моды кратко перечислены в списке портов серии Doom.

Файлы данных Doom по сей день остаются платными. Для создания бесплатного IWAD-файла был начат проект FreeDoom. Если к расширенной версии Doom добавить .WAD из FreeDoom, получаем полностью свободную игру.

Примечания

  1. Matthew Fell The Unofficial Doom Specs v1.666… (англ.) (HTML) (15 декабря 1994 года). — Неофициальная спецификация Doom. Проверено 25 августа 2011.
  2. 1 2 3 4 5 Исходные тексты Doom или первых его портов (например, Doom Legacy 1.11, 1.12)
  3. Player — The Doom Wiki — Doom, Doom 2, Doom 3, and more
  4. Demo — The Doom Wiki — Doom, Doom 2, Doom 3, and more
  5. Doom networking component — The Doom Wiki — Doom, Doom 2, Doom 3, and more
  6. Demo desyncing caused by menu access — The Doom Wiki — Doom, Doom 2, Doom 3, and more
  7. T_urning resolution is lowered when recording demos — The Doom Wiki — Doom, Doom 2, Doom 3, and more_
  8. Reject — The Doom Wiki — Doom, Doom 2, Doom 3, and more
  9. Doom rendering engine — The Doom Wiki — Doom, Doom 2, Doom 3, and more
  10. Doom rendering engine - The Doom Wiki - Doom, Doom 2, Doom 3, and more
  11. Doom Wiki: Aspect Ratio
  12. Исходный текст Smack My Marine Up
  13. Исходный текст Doom Legacy 1.11, функция ASM_PatchRowBytes.
  14. Например, Doom Legacy 1.11, 1.12
  15. Так поступают многие порты Doom — в частности, Doom Legacy и Smack My Marine Up; исходные тексты того и другого свободно доступны.
  16. Doom Wiki — Licenses (англ.)
  17. Engine bug — The Doom Wiki — Doom, Doom 2, Doom 3, and more
  18. Projectiles explode on impact with «sky» — The Doom Wiki — Doom, Doom 2, Doom 3, and more
  19. Bullet puffs do not appear in outdoor areas — The Doom Wiki — Doom, Doom 2, Doom 3, and more
  20. Monsters stuck in doortracks, walls or hanging off lifts — The Doom Wiki — Doom, Doom 2, Doom 3, and more
  21. Ghost monster — The Doom Wiki — Doom, Doom 2, Doom 3, and more
Просмотр этого шаблона DOOM
**_Doom_ (The Ultimate Doom) | Doom II: Hell on Earth Final Doom Doom 64 Doom 3 (Resurrection of Evil) Doom RPG Doom 4**
Разработка id Software | Nerve Software Джон Кармак Джон Ромеро Движок Doom
Порты серии Doom ZDoom • PrBoom • GZDoom jDoom WinDoom Skulltag
Книги и фильмы «По колено в крови» | «Ад на Земле» «Адское небо» Фильм
Вселенная Doom Кибердемон | Имп DoomGuy Ракетомёт Плазмоган BFG9000 Объединённая Аэрокосмическая Корпорация
Category Категория:DoomPortal Портал:Компьютерные игры
Просмотр этого шаблона id Software
Сотрудники Джон КармакДжон Ромеро • Адриан Кармак • Том Холл • Кевин Клауд • Марк Рейн • Америкэн Макги • Майкл Абраш • Тодд Холленсхед • Тим Уиллитс • Катерина Анна Канг • Джон Олик
Компания Softdisk • 3D Realms • FormGen • GT InteractiveZeniMax MediaQuakeCon • Masters of Doom
Серия Wolfenstein Wolfenstein 3DSpear of DestinyReturn to Castle Wolfenstein (Enemy Territory) • Wolfenstein
Серия Doom Doom (The Ultimate Doom) • Doom II: Hell on Earth (Final Doom • Master Levels for Doom II) • Doom 3 (Resurrection of Evil) • Doom 4
Серия Quake QuakeQuake IIQuake III Arena (Team Arena) • Quake 4Enemy Territory: Quake WarsQuake Live
Серия Commander Keen Marooned on Mars • The Earth Explodes • Keen Must Die! • Secret of the Oracle • The Armageddon MachineAliens Ate My Babysitter!
Другие игры Dangerous DaveDangerous Dave in the Haunted Mansion • Rescue Rover • Rescue Rover 2 • Shadow Knights • Hovertank 3DCatacomb 3-DRage
Технологии id Tech Wolfenstein 3D engineDoom engineQuake engineid Tech 2id Tech 3id Tech 4id Tech 5id Tech 6

Категории:

Wikimedia Foundation.2010.

Полезное

Смотреть что такое "Doom engine" в других словарях: