на каком движке сделан doom
Движок Doom
Движок Doom
Doom engine | |
Тип | Игровой движок |
Разработчик | id Software |
ОС | изначально |
Лицензия | изначально проприетарная, теперь GNU GPL |
Сайт | Сайт id Software |
Содержание
Улучшения движка (по сравнению с Wolfenstein 3D)
Ограничения
Однако у движка были ограничения:
Технические особенности
Движок был написан на Си на рабочих станциях NEXTSTEP. Изначально использовался компилятор Intel C, но в дальнейшем перешли на Watcom C. Утилиты были написаны под NeXT на объектном стиле.
Все вычисления проводятся в фиксированной запятой 16,16, с машинной единицей, равной одному текселю (рост игрока 56 текселей — значит, 1 тексель примерно равен 3 см). Для угловых величин применяется фиксированная запятая, в которой 65536 = 360°.
Запись демо-роликов и мультиплеер основаны том, что на цифровой ЭВМ один и тот же код с одними и теми же данными приводит к одному и тому же результату, а поведение целочисленной арифметики жёстко заспецифицировано и не зависит от модели процессора. Игра записывает в демо-ролик (и передаёт по сети) команды управления; если в игре нет грубых ошибок, различные машины, интерпретируя одни и те же команды управления, получают один и тот же результат. Впрочем, ошибки, приводящие к рассинхронизации, в игре всё-таки есть: в частности, если в одиночной игре зайти в меню, игра останавливается, но ролик продолжает писаться. Недостаток такого подхода — невозможность перемотать ролик; его можно только прокрутить с начала.
В режиме записи демо-роликов точность поворотов снижалась до 256 на 360 градусов; внимательный игрок мог заметить, что в режиме демо-записи наводка становится грубее. Это служило исключительно для экономии памяти в демо-роликах и реально не требовалось.
Каждый такт игра проводит цикл управления каждым монстром. Для того, чтобы сэкономить процессорные такты, существует битовая матрица REJECT: для любых двух секторов, если ни из одной точки сектора А не видна никакая точка сектора Б, на этом месте в матрице ставится единица. Если на пересечении строки, соответствующей сектору игрока, и столбца, соответствующего сектору монстра, стоит 0, проводится проверка, видит ли монстр игрока; если 1 — монстр гарантированно не видит игрока. Матрица REJECT очень сложна для построения, и большинство пользовательских редакторов не строили её (существовало очень мало утилит, которые проводили эту работу; основные — RMB и ZENNODE).
Рендеринг
Для ускорения отображения используется BSP-дерево (в отличие от порталов в Duke Nukem 3D). Объекты изображаются в виде спрайтов, в отличие от Quake.
Движое рекурсивно проходится по BSP-дереву, отрисовывая стены от дальних к ближним.
Во время этого цикла рисуются только глухие стены (то есть, средние текстуры для односторонних стен, и верхние и нижние — для двусторонних). Объекты, полы и решётки записываются в отдельные массивы и отрисовываются на более поздних стадиях. Кстати, массив, в котором хранятся полы, сделали довольно малым, и у самодеятельных конструкторов довольно часто случалось переполнение и выход с сообщением «No more visplanes!»
После того, как отрисованы стены, по строкам рисуются полы, записанные в visplanes.
В каждом секторе держится связанный список объектов, котоые находятся в нём. Для определения видимости объекта (а также для задания точек отсечки) используется одномерный аналог Z-буфера. Видимые объекты вместе с точками отсечки складываются в массив, после этого они сортируются и рисуются от дальних к ближним с помощью тех же процедур, что используются для рисования стен. На этом же этапе рисуются и решётки («средние» текстуры на двусторонних стенах).
Текстуры стен и спрайты хранятся в
Doom для DOS работал в четырёхстраничном X-режиме VGA 320×200 с тройной буферизацией, для Linux — использовал обычный режим VGA 13h. При этом цифра разрешения была закодирована в ассемблерных процедурах в двух местах; версии игры, которые использовали переменное разрешение, динамически модифицировали код, подставляя нужное разрешение. Впрочем, в частях игры, которые к движку не относятся, встречалось крайне много магических чисел, связанных с разрешением экрана и экранными координатами различных объектов, поэтому первые порты Doom’а страдали «расползающейся» в SVGA-режимах графикой меню.
Длительная загрузка
Doom известен своей длительной загрузкой (больше минуты на компьютерах своего времени). Основным пожирателем времени была инициализация некого «Doom refresh daemon». За этим непонятным названием стоит построение базы текстур.
По-видимому, фрагментирование текстур изначально было сделано для того, чтобы некоторые части текстур не затемнялись с расстоянием, как не затемняются спрайты снарядов (об этом говорит незадействованное поле в блоках TEXTURE1 и TEXTURE2 ). Как бы там ни было, яркие фонари на тёмных текстурах не вошли в игру.
Сетевой код
Doom основан на модели «равный с равным». Как было сказано выше, синхронность игры на всех машинах обеспечивается тем фактом, что один и тот же код с одними и теми же данными возвращает один и тот же результат. Во время каждого такта проверяются координаты игрока; если они не совпадают, игра прекращает работу с сообщением о рассинхронизации. Никаких средств противостояния задержкам передачи нет. Входа в начатую игру нет.
Поддержка того или иного сетевого протокола не включена в Doom. Для того, чтобы запустить игру по сети, игроки вызывают внешнюю программу — сетевой драйвер, который налаживает связь между машинами и вызывает EXE-файл Doom’а. Такая конструкция позволяет писать внешние драйверы для других сетевых протоколов — или программы запуска Doom’а по сети, более удобные, чем имеющиеся.
Каждый из игроков имеет свой цвет: первый — зелёный, второй — серый, третий — коричневый, четвёртый — красный. Номера игроков (и, соответственно, цвета) раздаются сетевым драйвером, а не игрой. В игре по MAC-адресов сетевых плат, в игре по модему или кабелю через SERSETUP — от случайных факторов.
Интересной недокументированной функцией Doom была одиночная игра на трёхмониторной системе: один показывает то, что спереди от игрока, второй — то, что слева, третий — то, что справа. Поскольку видеоплат с таким количеством мониторов на то время не существовало, для такой игры нужны были три компьютера, соединённых сетью. Впрочем, эта функция существовала лишь в зачатке: чтобы загрузиться с сохранения, требовалось на всех трёх компьютерах перезапустить игру.
Игры на движке Doom’а
Движок Doom’а продавался другим компаниям. На нём был сделан ряд игр. Среди них:
Открытие исходного кода
В 1996 году открыли исходные тексты сетевых драйверов. В декабре 1997 года случилась беспрецедентная (на то время) акция: полный исходный текст Doom для GNU/Linux был опубликован под несвободной бесплатной лицензией (версия для DOS не публиковалась из-за платной звуковой библиотеки DMX). Чи Хоан (Chi Hoang) был первым, кто сумел в январе 1998 года выпустить порт Doom для DosDoom.
Пионерами расширения Doom были Ли Киллоу (Boom — расширенная версия Doom, в которой были исправлены все ошибки оригинальной игры, а также серьёзно, почти в 1,5 раза, был ускорен движок), Денис Фабрис и Борис Перейра (Doom Legacy — версия Doom с качественным пользовательским интерфейсом и поддержкой высоких разрешений), а также Брюс Льюис — создал glDoom, первый порт Doom’а под резервной копии не было. Из-за этого Кармак перелицензировал исходные тексты под GNU General Public License: если бы лицензия не была такой ограничивающей, исходный текст обязательно нашёлся бы у кого-то. [1] Остальные ресурсы так и остаются платными.
Сейчас существует несколько десятков расширенных версий Doom — от простейших до чрезвычано мощных. Они позволяют играть с более высоким разрешением, чем оригинальный Doom, имеют дополнительные возможности (обзор вверх-вниз, перекрестие прицела), а также расширенную сетевую игру. Наиболее известные из этих версий:
В Doom Legacy и ZDoom присутствует возможность игры с ботами.
Менее значимые моды кратко перечислены в списке портов серии Doom.
Файлы данных Doom по сей день остаются платными. Для создания бесплатного FreeDoom [3]. Если к расширенной версии Doom добавить WAD из FreeDoom, получаем полностью свободную игру. По состоянию на апрель 2007 года, проект не готов, страдает плохим качеством изображения и ориентирован на Boom (под версиями, которые не являются производными Boom, непроходим уже первый уровень).
id Tech 5 название нового игрового движка, который разрабатывается компанией id Software. Название движка «id Tech 5» следует новой схеме обозначений, принятой в id Software. Эта схема, в отличие от предыдущей, даёт информацию о поколении движка (например, движок «Doom 3 engine» теперь называется «id Tech 4»). «id Tech 5» является пятым движком серии id Tech и является кроссплатформенным ПО, предназначенным для использования на персональных компьютерах (Microsoft Windows, GNU/Linux, Mac OS X) и игровых консолях Playstation 3 и Xbox 360.
История
11 июня 2007 года на конференции Apple’s Worldwide Developers Conference (WWDC), которая прошла в Сан-Франциско, США, был официально анонсирован движок «id Tech 5». Тогда же и состоялась первая демонстрация игрового движка. Движок демонстрировался Джоном Кармаком (англ. John Carmack) на восьмиядерном компьютере Apple Macintosh, однако демонстрационная версия использовала только одно ядро и однопоточную реализацию API OpenGL. В качестве видеокарты использовалась Quadro 7000 с 512 Мбайт видеопамяти.
На E3 2007, которая проходила с 11 по 13 июля 2007 года в Санта-Монике, Калифорния, движок был показан потенциальным лицензиарам на E3 2007, но не публике. Первая реальная общественная демонстрация состоялась на QuakeCon 2007 во время ежегодного лейтмотива, проведенного самим Джоном Кармаком. Тогда было заявлено, что id Tech 5 будет использоваться в новой разрабатываемой игре от id Software, «Rage», которая основана на полностью новой интеллектуальной собственности.
В интервью Джон Кармак заметил, что для id Tech 5, как и для его предшественников, в конечном счёте будет опубликован исходный код (open source). Это, вероятно, случится через много лет, за время которых id Tech 5 будет использоваться в коммерческих проектах. На QuakeCon 2007 Джон Кармак, ведущий разработчик игровых движков в id Software, заявил сайту «LinuxGames» о своём стремлении минимализировать использование в движке сторонних коммерческих (проприетарных) технологий, так как «в конечном счёте id Tech 5 тоже будет open source. В id Software мы всё ещё придерживаемся правила, согласно которому мы не интегрируем в движок те технологии, которые в конечном счёте не дадут нам возможности сделать движок открытым.»
7 мая 2008 года была официально анонсирована игра Doom 4. Позже стало известно, что и в ней будет использоваться id Tech 5.
В июле 2009 года Джон Кармак заявил сайту LinuxGames о поддержке ОС Linux в id Tech 5:
Нет твёрдых планов по портированию id Tech 5 игр на Linux, но, конечно, такая возможность не отвергается. Я не думаю, что будет очень сложным заставить id Tech 5 работать на бинарных драйверах от nVidia, но привнесение их к функциональности и приемлемой производительности на другие OpenGL-драйвера вероятно будет более существенным обязательством, чем мы можем себе позволить.
Политика лицензирования и поддержки
На данный момент (лето 2009) движок id Tech 5 не доступен для лицензирования, так как для лицензирования всё ещё предлагается id Tech 4. Однако уже можно сделать «предзаказ» на движок.
12 мая 2009 года Тодд Холленсхед, руководитель id Software, заявил, что компания собирается предоставлять движок Id Tech 5 для лицензирования только для очень небольшого количества «внешних» разработчиков. По мнению Холленсхеда, качество созданных на движке проектов влияет на «репутацию» самого движка, поэтому id Software планирует продать несколько лицензий «сильным» разработчикам. «Наша философия не изменилась с момента основания компании: игры на первом месте, продажа лицензий нового движка на втором, заявил он. В данный момент наибольшее внимание и все силы сосредоточены на создании Rage и Doom 4».
Особенности
При демонстрации движка было использовано около 20 Гбайт текстурных данных и полностью динамический изменчивый мир. В движке используется расширенная технология MegaTexture, которая использует текстуру с разрешающей способностью до 128.000 x 128.000 пикселов (в 16 раз больше по сравнению с последней версией id Tech 4, где использовалась текстура размером 32.768 x 32.768 пикселов).
Одной из особенностей рендерера будет использование полутени (англ. penumbra) при затенении, которая будет достигаться использованием теневых карт. Это не похоже на метод затенения движка id Tech 4, где тени получаются с очень резкими краями.
Джон Кармак упоминал в своём лейтмотиве на QuakeCon 2007 о том, что движок id Tech 5 будет использовать в качестве API открытый и кроссплатформенный OpenGL, а не Direct3D10.
Движок будет кроссплатформенным, и это позволит ему работать на разных платформах без переписывания кода под каждую платформу отдельно. Это уменьшит сложность разработки игры на разных системах.
Движок, вероятно, покажет многие другие графические эффекты, такие как различные материалы для освещения, работу с расширенным динамическим диапазоном (англ. HDR High Dynamic Range), а также размытость изображения движущегося объекта (англ. motion blur). Движок также будет поддерживать многопоточную обработку на многоядерном центральном процессоре. Рендеринг, игровая логика, искусственный интеллект, физический движок и звуковой движок будут исполнятся как параллельно, так и через отдельные потоки данных.
Doom engine
id Tech 1 | |
---|---|
Игровой движок (Список) | |
Разработчик | |
Ключевой программист | Джон Кармак |
Часть серии движков | id Tech |
Предыдущий движок серии | Wolfenstein 3D engine |
Следующий движок серии | Quake engine |
Аппаратные платформы | ПК, Macintosh, Amiga, SNES, Sega 32X, Sega Saturn, 3DO, PlayStation, Game Boy Advance, Atari Jaguar и другие |
Поддерживаемые ОС | DOS, Linux, FreeBSD, другие UNIX-подобные |
Написан на языке | Си, язык ассемблера |
Лицензия | до 1997 года — Коммерческое ПО после 1997 года — Свободное ПО: лицензия GNU GPL |
Первая игра на движке | Doom / 10 декабря 1993 года |
Последняя игра на движке | псевдотрёхмерный игровой движок, разработанный американской компанией 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 на самом деле двухмерные, что указывает на одно из ограничений движка: невозможно иметь комнату (сектор) над другой комнатой. Однако, с другой стороны, это позволяет без особых проблем рисовать карту уровня с отображением всех стен и объектов, в отличие от других игр этого жанра.
Уровни строятся по субтрактивному принципу: всё пространство заполнено непроходимой материей, и автор уровня «прорубает» в этой материи туннели. Основой уровня являются вершины (англ. vertices ) — точки в двухмерном пространстве. Между вершинами проводятся отрезки (англ. linedefs ). Отрезок может иметь одну или две стороны (англ. sidedefs ). Текстуры задаются не для отрезков, а для сторон, так что отрезок может быть покрыт с разных сторон разными текстурами.
Вершины и отрезки образуют плоский граф; каждая его грань может быть или непроходимым пространством (например, колонной) или сектором (англ. sector ). Иногда структуру секторов намеренно нарушают — на этом основаны спецэффекты наподобие невидимых мостов. Каждый сектор имеет в плане произвольную форму (не обязательно выпуклую или односвязную). У сектора всегда горизонтальные пол с потолком и постоянная освещённость. Односторонние отрезки являются глухими стенами, двусторонние — образуют переходы между секторами.
Чтобы обеспечить высочайшую на то время интерактивность, применены так называемые теги. Отрезок и сектор имеют особое целое поле — «тэг». Чтобы сделать выключатель, опускающий лифт, отрезку-выключателю задаются код действия «выключатель, опускающий лифт» и какой-нибудь тег (например, 5). Этот же тег присваивается сектору-лифту. При активации отрезок будет выполнять указанное действие на всех секторах с этим тегом.
Наконец, на уровне расставляются объекты ( things ). При этом набор характеристик объекта в Doom оказался довольно беден: например, не было Z-координаты, наземный объект в начале игры всегда стоял на полу, а воздушный — висел под потолком. Нельзя сделать, чтобы объект был только в одиночной игре, или только в deathmatch, или только в кооперативной (был лишь флаг «только в сетевых играх»).
В режиме записи демо-роликов точность поворотов снижалась до 256 на 360 градусов [2] [7] ; внимательный игрок может заметить, что в режиме демозаписи наводка становится грубее. Это служит исключительно для экономии памяти в демо-роликах.
Каждый игровой такт (1/35 секунды) игра проводит цикл управления каждым монстром. Для того, чтобы сэкономить процессорные такты, существует битовая матрица REJECT [8] : для любых двух секторов, если ни из одной точки сектора А не видна никакая точка сектора Б, на этом месте в матрице ставится единица. Если на пересечении строки, соответствующей сектору игрока, и столбца, соответствующего сектору монстра, стоит 0, проводится проверка, видит ли монстр игрока; если 1 — монстр гарантированно не видит игрока. Матрица REJECT очень сложна для построения, и большинство пользовательских редакторов заполняли её нулями (существовало очень мало утилит, которые строили её; основные — RMB и ZENNODE ).
Структура BLOCKMAP применяется физическим движком, чтобы ускорить проверку столкновений объектов с отрезками.
Рендеринг
Для ускорения отображения используется BSP-дерево [9] (в отличие от порталов в Duke Nukem 3D). Объекты изображаются в виде спрайтов, в отличие от Quake.
Движок рекурсивно проходится по BSP-дереву, отрисовывая стены от ближних к дальним [10] :
После того, как отрисованы стены, по строкам рисуются полы, записанные в visplanes.
В каждом секторе держится связанный список объектов, которые находятся в нём. На этапе прорисовки стен видимые объекты вместе с точками отсечки складываются в массив. После того, как движок нарисует полы и потолки, массив сортируется, и ближайшие 128 объектов рисуются от дальних к ближним с помощью тех же процедур, что используются для рисования стен. На этом же этапе рисуются и решётки («средние» текстуры на двусторонних стенах).
Длительная загрузка
Doom известен своей длительной загрузкой (больше минуты на компьютерах своего времени). Основная часть времени тратилась на инициализацию «демона перерисовки Doom» (англ. Init Doom refresh daemon ).
Сетевой код
Doom основан на модели «равный с равным». Как было сказано выше, синхронность игры на всех машинах обеспечивается тем фактом, что один и тот же код с одними и теми же данными возвращает один и тот же результат. С каждым пакетом передаётся «свёртка синхронизации» — обычно координата одного из игроков; если полученная с пакетом свёртка не совпадает с локально вычисленной, игра прекращает работу с сообщением о рассинхронизации. Никаких средств противостояния задержкам передачи нет; если средний пинг превышает 1/35 секунды, замедляется реакция игры на управление. Игра может запрашивать потерянные пакеты и дублировать их, чтобы запросы повторной передачи шли как можно реже. Входа в начатую игру нет.
Каждый из игроков имеет свой цвет: первый — зелёный, второй — серый, третий — коричневый, четвёртый — красный. Номера игроков (и, соответственно, цвета) раздаются сетевым драйвером, а не игрой. В игре по IPX через программу IPXSETUP отдаваемые игрокам цвета зависят от MAC-адресов сетевых плат, в игре по модему или кабелю через SERSETUP — от случайных факторов.
Интересной недокументированной функцией версий 1.0 и 1.1 была одиночная игра на трёхмониторной системе: один показывает то, что спереди от игрока, второй — то, что слева, третий — то, что справа. Поскольку видеоплат с таким количеством мониторов на то время не существовало, для такой игры нужны были три компьютера, соединённых сетью. Впрочем, эта функция существовала лишь в зачатке: чтобы загрузиться с сохранения, требовалось на всех трёх компьютерах перезапустить игру.
Игры на движке Doom
Движок Doom продавался другим компаниям. На нём был сделан ряд игр. Среди них:
Также фанатами игры создавались пользовательские моды, полностью преображавшие игру. Первый из таких модов — Alien Doom — был сделан по фильму «Чужой». Впоследствии появились моды и по другим фильмам: «Охотники за привидениями», «Бэтмен» и «Секретные материалы». См. Моддинг Doom’a.
Открытие исходного кода
В 1994 году открыли исходные тексты сетевых драйверов. Энтузиасты начали разрабатывать собственные драйверы: например, для LPT-кабеля ( PARSETUP ) и даже для цепочки COM-кабелей ( HX8 ).
Сейчас существует несколько десятков расширенных версий Doom — от простейших до чрезвычано мощных. Они позволяют играть с более высоким разрешением, чем оригинальный Doom, имеют дополнительные возможности (обзор вверх-вниз, перекрестие прицела), а также расширенную сетевую игру. Наиболее известные из этих версий:
В Doom Legacy, ZDoom и SkullTag присутствует возможность игры с ботами.
Менее значимые моды кратко перечислены в списке портов серии Doom.