Сайт о телевидении

Сайт о телевидении

» » Использование существующего движка. Какие бывают движки

Использование существующего движка. Какие бывают движки


Перед вами - второй материал из серии, посвящённой особенностям работы JavaScript на примере движка V8. В первом шла речь о механизмах времени выполнения V8 и о стеке вызовов. Сегодня мы углубимся в особенности V8, благодаря которым исходный код на JS превращается в исполняемую программу, и поделимся советами по оптимизации кода.

О JS-движках

JavaScript-движок - это программа, или, другими словами, интерпретатор, выполняющий код, написанный на JavaScript. Движок может быть реализован с использованием различных подходов: в виде обычного интерпретатора, в виде динамического компилятора (или JIT-компилятора), который, перед выполнением программы, преобразует исходный код на JS в байт-код некоего формата.

Вот список популярных реализаций JavaScript-движков.

  • - движок с открытым исходным кодом, написан на C++, его разработкой занимается Google.
  • Rhino - этот движок с открытым кодом поддерживает Mozilla Foundation, он полностью написан на Java.
  • SpiderMonkey - это самый первый из появившихся JS-движков, который в прошлом применялся в браузере Netscape Navigator, а сегодня - в Firefox.
  • JavaScriptCore - ещё один движок с открытым кодом, известный как Nitro и разрабатываемый Apple для браузера Safari.
  • KJS - JS-движок KDE, который разработал Гарри Портен для браузера Konqueror, входящего в проект KDE.
  • Chakra (JScript9) - движок для Internet Explorer.
  • Chakra (JavaScript) - движок для Microsoft Edge.
  • Nashorn - движок с открытым кодом, являющийся частью OpenJDK, которым занимается Oracle.
  • JerryScript - легковесный движок для интернета вещей.
В этом материале мы остановимся на особенностях V8.

Почему был создан движок V8?

Движок с открытым кодом V8 был создан компанией Google, он написан на C++. Движок используется в браузере Google Chrome. Кроме того, что отличает V8 от других движков, он применяется в популярной серверной среде Node.js.


Логотип V8

При проектировании V8 разработчики задались целью улучшить производительность JavaScript в браузерах. Для того, чтобы добиться высокой скорости выполнения программ, V8 транслирует JS-код в более эффективный машинный код, не используя интерпретатор. Движок компилирует JavaScript-код в машинные инструкции в ходе исполнения программы, реализуя механизм динамической компиляции, как и многие современные JavaScript-движки, например, SpiderMonkey и Rhino (Mozilla). Основное различие заключается в том, что V8 не использует при исполнении JS-программ байт-код или любой промежуточный код.

О двух компиляторах, которые использовались в V8

Внутреннее устройство V8 изменилось с выходом версии 5.9, которая появилась совсем недавно. До этого же он использовал два компилятора:
  • full-codegen - простой и очень быстрый компилятор, который выдаёт сравнительно медленный машинный код.
  • Crankshaft - более сложный оптимизирующий JIT-компилятор, который генерирует хорошо оптимизированный код.
Внутри движка используются несколько потоков:
  • Главный поток, который занимается тем, что от него можно ожидать: читает исходный JS-код, компилирует его и выполняет.
  • Поток компиляции, который занимается оптимизацией кода в то время, когда выполняется главный поток.
  • Поток профилировщика, который сообщает системе о том, в каких методах программа тратит больше всего времени, как результат, Crankshaft может эти методы оптимизировать.
  • Несколько потоков, которые поддерживают механизм сборки мусора.
При первом исполнении JS-кода V8 задействует компилятор full-codegen, который напрямую, без каких-либо дополнительных трансформаций, транслирует разобранный им JavaScript-код в машинный код. Это позволяет очень быстро приступить к выполнению машинного кода. Обратите внимание на то, что V8 не использует промежуточное представление программы в виде байт-кода, таким образом, устраняя необходимость в интерпретаторе.

После того, как код какое-то время поработает, поток профилировщика соберёт достаточно данных для того, чтобы система могла понять, какие методы нужно оптимизировать.

Далее, в другом потоке, начинается оптимизация с помощью Crankshaft. Он преобразует абстрактное синтаксическое дерево JavaScript в высокоуровневое представление, использующее модель единственного статического присваивания (static single-assignment, SSA). Это представление называется Hydrogen. Затем Crankshaft пытается оптимизировать граф потока управления Hydrogen. Большинство оптимизаций выполняется на этом уровне.

Встраивание кода

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


Вызов функции заменяется на её тело

Скрытые классы

JavaScript - это язык, основанный на прототипах: здесь нет классов. Объекты здесь создаются с использованием процесса клонирования. Кроме того, JS - это динамический язык программирования, это значит, что, после создания экземпляра объекта, к нему можно добавлять новые свойства и удалять из него существующие.

Большинство JS-интерпретаторов используют структуры, напоминающие словари (основанные на использовании хэш-функций), для хранения сведений о месте расположения значений свойств объектов в памяти. Использование подобных структур делает извлечение значений свойств в JavaScript более сложной задачей, чем в нединамических языках, таких, как Java и C#. В Java, например, все свойства объекта определяются не изменяющейся после компиляции программы схемой объекта, их нельзя динамически добавлять или удалять (надо отметить, что в C# есть динамический тип, но тут мы можем не обращать на это внимание). Как результат, значения свойств (или указатели на эти свойства) могут быть сохранены, с фиксированным смещением, в виде непрерывного буфера в памяти. Шаг смещения можно легко определить, основываясь на типе свойства, в то время как в JavaScript это невозможно, так как тип свойства может меняться в процессе выполнения программы.

Так как использование словарей для выяснения адресов свойств объекта в памяти очень неэффективно, V8 использует вместо этого другой метод: скрытые классы. Скрытые классы похожи на обычные классы в типичном объектно-ориентированном языке программирования, вроде Java, за исключением того, что создаются они во время выполнения программы. Посмотрим, как всё это работает, на следующем примере:

Function Point(x, y) { this.x = x; this.y = y; } var p1 = new Point(1, 2);
Когда происходит вызов new Point(1, 2) , V8 создаёт скрытый класс C0 .


Первый скрытый класс С0

Пока, ещё до выполнения конструктора, у объекта Point нет свойств, поэтому класс C0 пуст.

Как только будет выполнена первая команда в функции Point , V8 создаст второй скрытый класс, C1 , который основан на C0 . C1 описывает место в памяти (относительно указателя объекта), где можно найти свойство x . В данном случае свойство x хранится по смещению 0, что означает, что если рассматривать объект Point в памяти как непрерывный буфер, первое смещение соответствует свойству x . Кроме того, V8 добавит в класс C0 сведения о переходе к классу C1 , где указывается, что если к объекту Point будет добавлено свойство x , скрытый класс нужно изменить с C0 на C1 . Скрытый класс для объекта Point , как показано на рисунке ниже, теперь стал классом С1 .


Каждый раз, когда к объекту добавляется новое свойство, в старый скрытый класс добавляются сведения о переходе к новому скрытому классу. Переходы между скрытыми классами важны, так как они позволяют объектам, которые создаются одинаково, иметь одни и те же скрытые классы. Если два объекта имеют общий скрытый класс и к ним добавляется одно и то же свойство, переходы обеспечат то, что оба объекта получат одинаковый новый скрытый класс и весь оптимизированный код, который идёт вместе с ним.

Этот процесс повторяется при выполнении команды this.y = y (опять же, делается это внутри функции Point , после вышеописанной команды по добавлению свойства x).

Тут создаётся новый скрытый класс, C2 , а в класс C1 добавляются сведения о переходе, где указывается, что если к объекту Point добавляется свойство y (при этом речь идёт об объекте, который уже содержит свойство x), тогда скрытый класс объекта должен измениться на C2 .


Переход к использованию класса C2 после добавления к объекту свойства y

Переходы между скрытыми классами зависят от порядка, в котором к объекту добавляются свойства. Взгляните на этот пример кода:

Function Point(x, y) { this.x = x; this.y = y; } var p1 = new Point(1, 2); p1.a = 5; p1.b = 6; var p2 = new Point(3, 4); p2.b = 7; p2.a = 8;
В подобной ситуации можно предположить, что у объектов p1 и p2 будет один и тот же скрытый класс и одно и то же дерево переходов скрытых классов. Однако, на самом деле это не так. В объект p1 первым добавляется свойство a , а затем - свойство b . В объект p2 сначала добавляют свойство b , а затем - a . В результате объекты p1 и p2 будут иметь различные скрытые классы - результат различных путей переходов между скрытыми классами. В подобных случаях гораздо лучше инициализировать динамические свойства в одном и том же порядке для того, чтобы скрытые классы могли быть использованы повторно.

Встроенные кэши

V8 использует и другую технику для оптимизации выполнения динамически типизированных языков, называемую встроенным кэшем вызовов. Встроенное кэширование основано на наблюдении, которое заключается в том, что повторяющиеся обращения к одному и тому же методу имеют тенденцию происходить с использованием объектов одного типа. Более подробно об этом можно почитать . Если у вас нет времени слишком в это углубляться, читая вышеупомянутый материал, здесь мы изложим концепцию встроенного кэширования буквально в двух словах.

Итак, как же всё это работает? V8 поддерживает кэш типов объектов, которые мы передали в качестве параметра недавно вызванным методам, и использует эту информацию для того, чтобы сделать предположение о типах объектов, которые будут переданы как параметры в будущем. Если V8 смог сделать правильное предположение о типе объекта, который будет передан методу, он может пропустить процесс выяснения того, как получать доступ к свойствам объекта, а, вместо этого, использовать сохранённую информацию из предыдущих обращений к скрытому классу объекта.

Как связаны концепции скрытых классов и встроенных кэшей вызовов? Когда метод вызывается для некоего объекта, движок V8 должен обратиться к скрытому классу этого объекта для того, чтобы определить смещение для доступа к конкретному свойству. После двух успешных обращений одного и того же метода к одному и тому же скрытому классу, V8 опускает операцию обращения к скрытому классу и просто добавляет сведения о смещении свойства к самому указателю объекта. Выполняя вызовов этого метода в будущем, V8 предполагает , что скрытый класс не менялся и идёт прямо по адресу памяти для конкретного свойства, используя смещение, сохранённое после предыдущих обращений к скрытому классу. Это очень сильно увеличивает скорость выполнения кода.

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


Перед нами объекты одного типа, но их свойства a и b были созданы в разном порядке и имеют разное смещение

Компиляция в машинный код

Как только граф Hydrogen оптимизирован, Crankshaft переводит его в низкоуровневое представление, которое называется Lithium. Большинство реализаций Lithium зависимо от архитектуры системы. На этом уровне, например, происходит выделение регистров.

В итоге Lithium-представление компилируется в машинный код. Затем происходит то, что называется замещением в стеке (on-stack replacement, OSR). Перед компиляцией и оптимизацией методов, в которых программа тратит много времени, нужно будет поработать с их неоптимизированными вариантами. Затем, не прерывая работу, V8 трансформирует контекст (стек, регистры) таким образом, чтобы можно было переключиться на оптимизированную версию кода. Это очень сложная задача, учитывая то, что помимо других оптимизаций, V8 изначально выполняет встраивание кода. V8 - не единственный движок, способный это сделать.

Как быть, если оптимизация оказалась неудачной? От этого есть защита - так называемая деоптимизация. Она направлена на обратную трансформацию, возвращающую систему к использованию неоптимизированного кода в том случае, если предположения, сделанные движком и положенные в основу оптимизации, больше не соответствуют действительности.

Сборка мусора

Для сборки мусора V8 использует традиционный генеалогический подход «пометь и выброси» (mark-and-sweep) для маркировки и очистки предыдущих поколений кода. Фаза маркировки предполагает остановку выполнения JavaScript. Для того, чтобы контролировать нагрузку на систему, создаваемую сборщиком мусора и сделать выполнение кода более стабильным, V8 использует инкрементный алгоритм маркирования: вместо того, чтобы обходить всю кучу, он пытается пометить всё, что сможет, обходя лишь часть кучи. Затем нормальное выполнение кода возобновляется. Следующий проход сборщика мусора по куче начинается там, где закончился предыдущий. Это позволяет добиться очень коротких пауз в ходе обычного выполнения кода. Как уже было сказано, фазой очистки памяти занимаются отдельные потоки.

Ignition и TurboFan

С выходом в этом году V8 версии 5.9. был представлен и новый конвейер выполнения кода. Этот конвейер позволяет достичь ещё большего улучшения производительности и значительной экономии памяти, причём, не в тестах, а в реальных JavaScript-приложениях.

Новая система построена на базе интерпретатора Ingnition и новейшего оптимизирующего компилятора TurboFan . Подробности об этих новых механизмах V8 можно почитать в этом материале.

С выходом V8 5.9 full-codegen и Crankshaft (технологии, которые использовались в V8 с 2010-го года) больше применяться не будут. Команда V8 развивает новые средства, стараясь не отстать от новых возможностей JavaScript и внедрить оптимизации, необходимые для поддержки этих возможностей. Переход на новые технологии и отказ от поддержки старых механизмов означает развитие V8 в сторону более простой и хорошо управляемой архитектуры.


Улучшения в тестах производительности для браузерного и серверного вариантов использования JS

Эти улучшения - лишь начало. Новый конвейер выполнения кода на основе Ignition и TurboFan открывает путь к дальнейшим оптимизациям, которые улучшат производительность JavaScript и сделают V8 экономичнее.

Мы рассмотрели некоторые особенности V8, а теперь приведём несколько советов по оптимизации кода. На самом деле, кстати, всё это вполне можно вывести из того, о чём мы говорили выше.

Подходы к оптимизации JavaScript-кода для V8

  1. Порядок свойств объектов . Всегда инициализируйте свойства объектов в одном и том же порядке. Нужно это для того, чтобы одинаковые объекты использовали одни и те же скрытые классы, и, как следствие, оптимизированный код.
  2. Динамические свойства . Добавление свойств к объектам после создания экземпляра объекта приведёт к изменению скрытого класса и к замедлению методов, которые были оптимизированы для скрытого класса, используемого объектами ранее. Вместо добавления свойств динамически, назначайте их в конструкторе объекта.
  3. Методы . Код, который несколько раз вызывает один и тот же метод, будет выполняться быстрее, чем код, который вызывает несколько разных методов по одному разу (из-за встроенных кэшей).
  4. Массивы . Избегайте разреженных массивов, ключи которых не являются последовательными числами. Разреженный массив, то есть массив, некоторые из элементов которого отсутствуют, будет обрабатываться системой как хэш-таблица. Для доступа к элементам такого массива требуется больше вычислительных ресурсов. Кроме того, постарайтесь избежать заблаговременного выделения памяти под большие массивы. Лучше, если их размер будет увеличиваться по мере надобности. И, наконец, не удаляйте элементы в массивах. Из-за этого они превращаются в разреженные массивы.
  5. Числа . V8 представляет числа и указатели на объекты, используя 32 бита. Он задействует один бит для того, чтобы определить, является ли некое 32-битное значение указателем на объект (флаг - 1), или целым числом (флаг - 0), которое называется маленьким целым числом (SMall Integer, SMI) из-за того, что его длина составляет 31 бит. Если для хранения числового значения требуется более 31 бита, V8 упакует число, превратив его в число двойной точности и создаст новый объект для того, чтобы поместить в него это число. Постарайтесь использовать 31-битные числа со знаком везде, где это возможно, для того, чтобы избежать ресурсоёмких операций упаковки чисел в JS-объекты.

Итоги

Мы, в SessionStack, стараемся следовать вышеизложенным принципам при написании JS-кода. Надеемся, немного разобравшись в том, как работают внутренние механизмы V8, и учтя то, что мы рассказали выше, вы сможете улучшить качество и производительность ваших программ.

Инструкция пользователя

В этом разделе даны подробные указания по работе с движком. Поскольку он может быть использован по-разному, необходимо выделить несколько пунктов, по которым пользователь сможет найти указания к использованию именно той области работы движка, которая ему нужна.

Поскольку данный программный продукт не является конечным, он предназначен для пользователей, которые знакомы с синтаксисом языка Delphi и (хотябы в общих чертах) с DirectX9. Пользователю, не знакомому с программированием эта программа будет безполезна.

Как работать с «движком»

Для начала необходимо посмотреть на программный код всех модулей, который можно увидеть в разделе «Приложения». Основные изменения при программировании собственных проектов, нужны в функциях «движка» InitObject, InitGraphObject и KeyControl.

Для того, чтобы добавить загрузку еще одного объекта, достаточно скорректировать значение константы CURRENT_OBJECTS_NUM (она должна быть равна количеству объектов, загружаемых в программе) и написать ряд команд, аналогичных уже имеющимся (которые загружают тестовые объекты). В функции InitObject:

if typ="Название пользовательского объекта" then

objects.LoadMeshFromFile("путь к Х-файлу пользовательского объекта", "путь к текстуре пользовательского объекта");

Далее, в разделе «Var» функции InitGraphObject необходимо добавить еще одну переменную типа D3DMATRIX. Эта переменная устанавливает положение объекта. Далее необходимо задать ее значения и вызвать метод SetWorldPos, в параметре которого указать заполненную матрицу. Объект установлен.

Если пользователю нужен новый источник освещения, то в разделе «Var» функции InitGraphObject нужно указать еще одну переменную типа TD3DXVECTOR3 и заполнить ее значением направления нового источника света. Чтобы установить новую лампочку нужно вызвать метод «движка» объекта SetLightPos. Пример:

lp:=D3DXVECTOR3(20, 20, 0);

objects[n].SetLightPos(lp, l);

Где lp - вектор направления новой лампочки, n - номер объекта, а l - индекс лампочки.

Устройства ввода

Чтобы назначить действие какой-либо клавиши клавиатуры или мыши, нужно добавить одну строчку (в функцию «движка» игры KeyControl), в которой сначала идет проверка на нажатие нужной клавиши, а далее, если клавиша нажата, действие. Пример:

if bKeyBuffer = $080 then Действие;

Константы, которые определяют клавиши можно найти в заголовочном файле DirectInput. Содержимое этого файла можно посмотреть на прилагаемом диске в папке DirectXBorland_D6-7. Для добавления действий по нажатию клавиш мыши не нужно писать проверку, она уже есть в функции, осталось только добавить код действия в блок begin end; Пример.

С недавним релизом бесплатной версии Unreal Engine и анонсом бесплатного Source 2 у вас появилось ещё больше возможностей делать собственные игры. Но выбор движка, подходящего под ваши потребности и навыки – дело не самое простое. Давайте же пробежимся по лучшим образцам бесплатного (ну почти, о чем ниже) софта для новичков и профессионалов.

Помимо движков в данной подборке существует еще масса не очень известных, но, если сказать помягче, очень крутых движков второго эшелона. Как правило на сайте разработчика есть упоминание возможности лицензирования, но в очень сыром виде, тут придется связываться напрямую. У всех движков есть свои плюсы и минусы. Например, движок недавнего Dying Light, разрабатываемый Techland , хорошо подходит для игр с открытым миром, но у него проблемы с дальностью прорисовки.

Чтобы серьёзно углубиться в большинство этих программных средств, от вас потребуются как минимум базовые навыки программирования. Но в некоторых случаях можно будет обойтись даже без них и сразу взяться за дело.

На передовой технологий – CryENGINE

CryENGINE – это чрезвычайно мощный игровой движок, созданный компанией-разработчиком Crytek, впервые представленный в игре Far Cry. Он предназначен для разработки под PC и консоли, включая PlayStation 4 и Xbox One. Его графические возможности превосходят Unity и UDK, и время от времени стоят на шаг впереди Unreal Engine 4: новейшее освещение, реалистичная физика, продвинутые системы анимации и многое другое. Последней игрой на CryENGINE была Ryse: Son of Rome. По аналогии с UDK и UE4 в CryENGINE встроены мощные и интуитивные функции, касающиеся работы с дизайном уровней.

Продуктивное использование CryENGINE потребует определённого времени на его изучение, и у вас могут возникнуть затруднения при отсутствии опыта работы с другими движками. Если вам не нужна графика уровня Crysis 3 или Ryse: Son of Rome, стоит присмотреться к чему-то более дружелюбному к пользователю.

Ценовая модель CryENGINE несколько отличается от конкурентов. За использование движка . Он не полностью бесплатный, как UE4 или Unity 5, зато не требует выплаты роялти, так что $9,90 – это всё, что вам придётся платить Crytek. В зависимости от размера вашей студии и команды, отсутствие роялти может быть огромным преимуществом.

Начинающим – Stencyl или GameMaker

Если вы только начинаете делать игры и не имеете никакого опыта в программировании, вам лучше начать с простейших инструментов. Из таковых самые популярные и общепризнанные – это Stencyl и GameMaker. Оба просты в освоении новичками, и на их основе уже создано несколько качественных игр.

Stencyl позволяет делать игры без программирования. Интерфейс полностью основан на перетаскивании, игры можно выпускать на Windows, Mac, Linux, iOS, Android и Flash. Если вы когда-нибудь имели дело с чем-то вроде Scratch, вы сразу узнаете LEGO-подобный подход к построению кода посредством размещения блоков. Stencyl задуман для простого создания спрайтовых игр, поэтому чаще служит основой паззлам и сайд-скроллерам. Что-нибудь сложное сделать будет проблематично, так что если решили работать над RPG или стратегией, присмотритесь к другому софту. С помощью Stencyl на свет появилось несколько популярных игр, в том числе Impossible Pixel и Zuki’s Quest. Также в нём есть встроенное обучение, которое расскажет обо всём, что вам нужно знать.

GameMaker – другая бесплатная утилита для новичков, с помощью которой можно делать игры для Windows, Mac, iOS и Android. Как и в Stencyl, тут почти всё работает на перетаскивании, но есть ещё и хуки для многопользовательских игр, ссылки на внешние SDK, возможность покопаться в коде и многое другое. Бесплатная версия при экспорте накладывает водяные знаки, но, тем не менее, GameMaker отлично подходит для первого раза и содержит встроенное обучение основам. Тут нет такового жанрового ограничения, как в Stencyl, и можно найти отдельные руководства для разных типов игр. В GameMaker сделали оригинальную версию Spelunky и Hotline Miami.

Конечно, всё не ограничивается этими двумя вариантами. Buildbox – относительно новая утилита, доступная в течение пробного периода и предлагающая тренировочную программу для изучения её работы, а GameSalad – уже давно известная популярная платформа, правда на неё жалуются из-за багов и нестабильной работы. Construct стоит внимания, если хотите делать игры на HTML5. В каждом случае главная проблема в том, что придётся сдерживать свои дизайнерские идеи. Это софт для новичков, и вы просто сломаете его в попытке сделать что-то сложное. То есть, игры получатся забагованными и нерабочими, если вы попытаетесь выйти за рамки задуманной системы. И всё же, это превосходное место для старта и подходящий вариант при отсутствии опыта в программировании.

Программистам среднего уровня, нацеленным на 2D-игры – Cocos2D

Cocos2D – это программа с открытым исходным кодом для создания 2D-игр. Игры можно выпускать на Windows, Mac, Android, iOS, Windows Phone или на веб-платформе.

Большая часть того, что вы будете делать в Cocos2D – это работа с C++ (также есть поддержка Lua и JavaScript), так что вам нужно освоить этот язык программирования, прежде чем вообще браться за Cocos2D. Однако, при знании упомянутых языков, программа становится довольно простой в использовании. В ней есть полноценная IDE, и она совершенно бесплатна, без каких-либо условностей. Как понятно по названию, утилита предназначена для создания двумерных игр, так что и работает она лучше с простыми спрайтовыми играми, где 3D ни к чему. 2D-игры можно делать и на Unity (который мы рассмотрим чуть далее), но в Cocos2D вникнуть попроще, если вы только начинаете (и конечно, знаете C++).

На Cocos2D создано немало успешных игр различных жанров, включая увенчанную наградами Badland.

Разработчикам, нацеленным на мобильные платформы – Unreal Engine или Unity

Если вы заинтересованы в сложных, трёхмерных играх, два наиболее популярных инструмента для их создания – это Unreal Engine и Unity. У обоих есть свои сильные и слабые стороны и разные моменты в лицензионных соглашениях, с которыми стоит ознакомиться перед принятием окончательного решения.

Unity позволяет вам делать трёхмерные и двумерные игры практически для любой платформы, включая Windows, Mac, Xbox, Playstation, Android, iOS и не только. Он поддерживает игровые ресурсы, созданные в 3ds Max, Maya, Softimage, Cinema 4D, Blender и другом софте. Unity использует C#, наряду с собственным языком программирования, так что не помешает для начала хорошенько их изучить. Если сравнивать Unity и Unreal, первый, пожалуй, попроще в освоении. У него есть богатый набор готовых поведений и встроенная библиотека игровых ресурсов, в которой довольно просто за ними следить. Во время работы над этим текстом я общался с несколькими разработчиками, и они думают, что Unity – лучший движок для первых проектов, потому что его проще понять и изучить, чем Unreal. Если вы уже сделали игру, скажем, на GameMaker, то сразу разберётесь, что к чему в Unity. Ещё Unity поддерживает альтернативные модели оплаты прямо в движке, включая несколько free-to-play моделей монетизации.

Функционал бесплатной персональной версии уже достаточно богат для вашего первого проекта. Создав игру на бесплатной версии, вам не нужно платить лицензионные отчисления или роялти, но тут есть некоторые оговорки, а именно – вы не сможете получить больше $100000 спонсирования /прибыли. В помощь начинающим разработчикам по Unity написано множество обучающих статей. Популярные игры на этом движке: Alto’s Adventure, Gone Home и находящаяся в разработке .

Unreal Engine 4 использует C++, так что при должном знании этого языка можно остановить свой выбор на нём, впрочем, игры можно будет создавать и не углубляясь в сам язык. Игры, сделанные на Unreal, Engine можно выпускать на PC, Mac, iOS, Android, Xbox One и Playstation 4. В Unreal в движок встроено практически всё, что вам понадобится, включая 3D-моделирование и работу с ландшафтом. Из-за столь богатого наполнения, освоить Unreal Engine 4 сложнее других инструментов разработки, и даже при хорошем знании C++ вам стоит приготовиться к изучению множества новых вещей. Зато вы сможете создавать по-настоящему впечатляющие игры. О тонкостях устройства Unreal можно узнать больше с помощью реверс-инжиниринга, но всё же без предварительного опыта разобраться с ним будет нелегко. Unreal Engine 4 – относительно новый движок, но на нём уже вышли такие игры, как Daylight и Tekken 7.

Для использования Unreal Engine 4, вам нужно дать согласие на выплату роялти, если ваша игра будет продаваться. После начала продаж игры или приложения вы платите за квартал. Может показаться, что это слишком большие деньги, но с учётом прибыли, которую будет приносить игра, это не так уж много.

Также стоит присмотреться к движку Source 2 от Valve, который в этом году тоже должен стать бесплатным.

Обновлено 01.10.15: В августе на GDC . Stingray работает на ядре технологии Bitsquid и основан на 64-разрядной архитектуре. Stingray был разработан, чтобы быть очень гибким и работать с всеми популярными платформами, от мобильных до виртуальной реальности. Технологии модульной структуры и управляемых данных означают, что разработчикам гораздо проще вносить изменения и можно сразу увидеть результаты сразу на нескольких подключенных устройствах, без повторной компиляции. Плюс к этому возможен быстрый перенос объектов между продуктами Autodesk. Прорыва с автоматизацией разработки пока не случилось. Если вы уже используете Unity или Unreal, то переходить не стоит, выигрыш пока не очень заметен. Позже мы расскажем подробней.

Король разработки – Source 2

На GDC 2015 Valve сделала несколько громких анонсов, и самым главным для игрового сообщества из них, наверное, был анонс Source 2. Это преемник движка Source, использовавшегося в Counter-Strike: Source, Half-Life 2 и множестве других игр. Разработчики уже несколько лет с нетерпением ждали движка следующего поколения в арсенале Valve. На пресс-конференции Джей Стелли (Jay Stelly) из Valve сказал: « для разработчиков контента. Наряду с анонсами Epic и Unity это поможет PC оставаться доминирующей платформой создания контента». Очевидно, Valve решила присоединиться к гонке движков вместе с Epic и Unity, предложив разработчикам больше вариантов на выбор. Однако, пока не совсем ясно, что значит «бесплатно для разработчиков контента»: речь о любых зарекомендовавших себя разработчиках или это какая-то особенная категория?

О дате релиза конкретной информации нет, известно лишь, что Source 2 выйдет в ближайшем будущем. Джей Стелли также заявил: «Мы нацелены на повышение продуктивности авторов контента. Учитывая, насколько важным становится пользовательский контент, Source 2 предназначен не только для профессионалов, он позволяет и самим игрокам принимать участие в разработке своих любимых игр». По этим словам можно предположить, что Source 2 будет доступен не только профессиональным студиям, но и любителям и моддерам, что сделали многие игры Valve такими популярными.

Мы обратились к Valve за дополнительной информацией, и эта статья будет дополнена, когда о новом движке будет известно больше. Но уже сейчас можно сказать наверняка, что Source 2 станет серьёзным конкурентом тяжеловесам в лице Unity и Unreal Engine 4, ведь, по словам Джелли, он тоже будет бесплатным.

Писателям – Twine/RPG Maker/AXMA

Не все мы эксперты в программировании, и даже Stencyl многим может показаться сложноватым. Если вы рассматриваете себя больше как рассказчика историй, у вас на выбор есть два прекрасных варианта: Twine и RPG Maker.

Для создания интерактивных нелинейных историй. Проще говоря, можно сделать игру в жанре «выбери своё приключение». Утилита невероятно проста в использовании. Вы соединяете сюжетные отрезки с помощью различных переходов, примерно как в диаграммах связей. Каждый доступный игроку выбор ведёт к новому тексту. Когда закончите, можете сразу разместить результат на сайте. Всё вполне понятно, но если где-то застряли или хотите добавить что-нибудь ещё, вам поможет руководство для начинающих. Популярные игры, созданные в Twine: A Kiss и Cry$tal Warrior Ke$ha.

Если Twine кажется вам чересчур старомодным, попробуйте RPG Maker. В бесплатной версии меньше возможностей, чем в платных альтернативах, но и она на многое способна. В изучении система проста: графика перетаскивается, диалоги добавляются в один клик. Чтобы сделать что-нибудь поинтереснее обычной RPG, придётся мыслить нестандартно, но примеры в лице тепло принятых публикой To the Moon и LISA дают понять, что это возможно. Вы можете пользоваться бесплатной музыкой и изображениями, так что даже рисовать уметь не нужно. Встроенное обучение, опять же, поможет вам в создании первой игры. Популярные игры на RPGMaker: Clock of Atonement и One Night. У Twine существует отечественный аналог AXMA Story Maker к которому также стоит присмотреться.

Бесплатный софт для игровых ресурсов

Конечно же, игра – это не только движок. Вам понадобятся всевозможные игровые ресурсы, в том числе изображения и звуки. Несколько опрошенных мной инди-разработчиков поделились полезными ссылками:

Tiled – простой редактор карт для Cocos2D, Unity и других инструментов.

OpenGamesArt – бесплатные изображения и графические заглушки.

Free Music Archive – бесплатная музыка с лицензиями Creative Commons.

FreeSound – коллекция бесплатных звуковых эффектов.

Всё это поможет вам делать игры без особых затрат. Разумеется, придётся вкладывать в них своё время, кровь, пот и слёзы, но, по крайней мере, ваш кошелёк не попадёт под удар.

В этой статье мы рассмотрим использование физики для имитации броска снарядов (да, прямо как в Angry Birds). Мы обратим внимание на основы использования 2D физики, а также на создание физических тел, импульсов и сил. Не забудем отметить и наиболее популярные игровые движки для симуляции физических 2D миров.

Обратите внимание, что для этой статьи уже доступно продолжение: и

Функции физического движка

Зачем нам использовать какой-то физический движок? И что это такое на самом деле?
Б
Вообще физический движок очень полезен. Он позволяет сделать за нас две важные вещи:

  • Обнаружение столкновений (коллизий) между нашими игровыми объектами;
  • Имитация силы и движений в результате столкновений.

Обнаружение столкновений

Игры были бы не очень интересными, если ваш персонаж провалился бы сквозь пол, не сделав ни одного шага или прыжка. Или если бы нога вашего персонажа прошла бы сквозь врага, которого вы хотели пнуть. Обнаружение столкновений позволяет очень точно определять взаимодействие двух тел.

Имитация силы

Что должно произойти после столкновения? Могут произойти различные явления: может прыгнуть персонаж, может прыгнуть какой-то другой игровой объект, а может вы просто будете двигаться в каком-то направлении. Все это выполняется движком за кадром. Но силы, которые может имитировать физический движок, не ограничены столкновениями. Существуют такие понятия, как гравитация и импульс. Они могут применяться к телам, даже если те не сталкивались. Также такие силы могут влиять на действия, которые происходят в игре, на движения героев и даже на сам мир.

Итак, давайте посмотрим вкратце на устройство физического движка, но сначала обратим свое внимание на их разновидности и определимся с выбором исходя из наших потребностей.

Выбор физического движка

На этом этапе у вас есть два варианта. Оба варианта имеют как достоинства, так и недостатки:

  1. Использовать существующий физический движок;
  2. Написать свою реализацию (с преферансом и куртизанками).

Использование существующего движка

Существуют несколько отличных готовых вариантов. Один из самых популярных движков для 2D игр это, безусловно, Box2D . Написан был изначально на C++, однако был портирован практически на все популярные языки программирования. Другим достаточно известным движком является Chipmink 2D , который используется как основной в таких фреймворках, как Cocos2D .

Написание своего движка

В некоторых играх использование существующего решения - излишняя роскошь. Дело в том, что физический движок использует немало драгоценной памяти, и в простеньких играх может вызвать излишнюю нагрузку, которой можно было бы избежать. Согласитесь, в простых платформерах или арканоидах нам не требуется вычислять место контакта с точностью до пикселя. Ресурсы, которые придется тратить на вычисление такой коллизии, мы можем потратить в другом месте, где это было бы уместнее.

Да, создание собственного физического движка даст вам больше гибкости, чем уже готовый продукт. Однако не забывайте и о том, что этот процесс достаточно скрупулезный, и вы, в конце концов, можете реализовать что-то более сложным способом, чем это же делается в готовом движке.

Цикл игры

Прежде чем рассматривать свойства и детали моделирования физики, давайте посмотрим на то, что происходит в каждом игровом кадре при подходе «в лоб»:


Типичный цикл игры для каждого кадра будет проходит четыре шага в следующем порядке:

  • Вход в кадр;
  • Обновление игровой логики;
  • Симуляция физики;
  • Отрисовка кадра.

Обратите внимание, что отрисовка кадра происходит после симуляции физики. Такой порядок, разумеется, не лишен смысла.

Также обратите внимание на то, что в нашем примере физика моделируется каждый кадр. Каждый! Это может привести к большим задержкам, если у вас очень много физических тел на экране. Всегда следите за этим показателем - не позволяйте вашей игре слишком долго имитировать физический мир. На самом деле обновлять физику не обязательно для каждого кадра, читайте далее.

Фиксированная частота кадров против варьируемой

Давайте поговорим о частоте кадров: фиксированной (fixed rate) и варьируемой (frame dependent rate). Метод update вызывается один раз за кадр игровой сцены. Если ваш метод симуляции физики вызывается из метода update, то ваш физический мир будет зависеть от частоты кадров. Это может привести к нереалистичному поведению физических тел. В iOS этот эффект решается за счет использования булевского свойства usesPreciseCollisionDetection . Но что насчет других операционных систем?

Рассмотрим отрывок кода:

CFTimeInterval timeSinceLast = currentTime - self.lastUpdateTimeInterval; self.lastUpdateTimeInterval = currentTime; if (timeSinceLast > 1) { timeSinceLast = 1.0/60.0; }

Этот код предназначен для компенсации проблем с дельта-значением времени. Актуально это будет в том случае, если во время игры вам позвонили. Тогда вы сможете при помощи такого алгоритма восстановить дельта-значение времени (для игры с 60 FPS).

Это на самом деле первый шаг в понятии работы физического движка. Да, предыдущий кусочек кода сделает нашу симуляцию более стабильной, но всех проблем он не решит. Для этого нам понадобится удалить вызов функции моделирования физики из цикла рендеринга игровой сцены, а затем создать фиксированный цикл. В течение этого цикла и будет работать симуляция физики. Например, если ваша игра рассчитана на работу в 60 кадров в секунду, то вы устанавливаете частоту моделирования физики в 60 раз в секунду. Такое разделение обязанностей позволит нам устранить множество проблем.

Подытожив, хочется сказать, что раз уж вы решили писать свой физический движок - будьте добросовестными и делайте все правильно. На этом первая часть нашей статьи заканчивается. В мы поговорим о физических телах и их свойствах, а также упомянем типичные ограничения физических движков.

От автора: приветствую вас, друзья. Данная статья рассчитана на новичков, на тех, кто совсем недавно установил CMS DLE и хочет узнать, как работать с DLE. Итак, давайте вкратце узнаем, что же это за движок такой и как с ним работать. Приступим?

Итак, вы только что установили DLE или собираетесь его установить. Если вы все еще сомневаетесь в том, стоит ли использовать эту CMS или возможно стоит познакомиться с другим движком, тогда стоит для самого себя ответить на один простой вопрос: — для каких целей вам нужен сайт?

Если вы хотите создать блог или новостной сайт, то есть сайт, на котором регулярно будете публиковать различные статьи, тогда DLE будет идеальным выбором. Собственно, это же сказано и на официальном сайте движка:

Хорошо, для блога или новостного сайта (если именно такова тематика вашего ресурса) DLE подойдет. А что насчет преимуществ самого движка? Об этом также можно прочесть на той же главной странице офсайта:

К безусловным преимуществам движка можно отнести его производительность. DLE — это действительно одна из самых быстрых CMS и если скорость работы сайта для вас важна, тогда DLE будет неплохим выбором.

Ну что же, с вопросом — что такое DLE — мы более-менее разобрались. А теперь давайте перейдем к вопросу как работать с DLE. И здесь нет ничего сложного. DLE отличается продуманным и логичным интерфейсом админпанели, с которой разберется даже новичок за считанные минуты. Например, наиболее частой операцией, как вы понимаете, будет публикация статей и новостей. Инструменты для этого всегда под рукой на самом видном месте админпанели — это две кнопки в правом верхнем углу админпанели.

Кстати, а как попасть в админпанель? Находится она по адресу http://your-site/admin.php. Перейдя по нужному адресу, мы увидим форму авторизации для доступа к святая святых нашего сайта — его админки.

Ну а о подробнее о работе с админкой DLE вы можете прочесть в статье . В этой статье мы пройдемся по наиболее часто используемым пунктам админки и познакомимся с админпанелью детальнее. На этом я с вами прощаюсь. Удачи!