Оффтоп Anton Nadtoka
1 947

Структура игрового движка

Приветствую разработчиков игр и движков. Начинаем цикл статей по структуре и описанию игрового движка. В большей степени будет разговор о мобильной версии движка.
В закладки

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

Game - это сама игра. В этот модуль входит не только код игры, но и ресурсы Есть разные варианты реализации этого модуля. Иногда язык написания игры совпадает с языком движка. К примеру движок написан на С++ и сама игра также написана на С++. В других случаях между модулем Game и движком появляется еще один слой-прослойка. Которая предоставляет другие варианты разработки. К примеру на языке Lua, CSharp и другие. Пример движки LOVE, Corona SDK - разработка игры реализуется на Lua, основной код движка скрыт и не доступен.

Engine API - это все то, с помощью чего можно работать с движком. Набор функций, классов и структур.

Core - ядро движка, тут происходит жизненный цикл игры. Это основной компонент, который связывает все остальные.

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

Physic engine - физический движок. Это может быть как-то самописный или готовое решение. Среди используемых Box2D, Havok, Tokamak.

Resource manager - менеджер ресурсов. Довольно важный компонент движка. Позволяет работать с ресурсами - звуками, графикой и другими файлами. Позволяет оптимизировать работу с загрузкой и переиспользованием. К примеру нужно использовать в 10 разных местах один и тот же звук - мы будет хранить только 10 ссылок и один загруженный файл, вместо 10 выделенных блоков одних и тех же данных. При нехватке памяти, данные будет выгружены. И другие полезные функции по работе с ресурсами.

Graphics - модуль графики. Здесь у нас будет реализован рендер. Для разных систем будет разные API для графики. До недавнего времени это был OpenGL ES 2 (и просто OpenGL). Сейчас идет разделение графических подсистем. Для iOS\OSX это Metal, для остальных пока OpenGL, Vulkan.

Sound - звуковой модуль. Позволяет воспроизводить звуки и музыку. В качестве форматов используется несжатый wav и сжатый mp3 для музыки. Но все потребности может покрыть открытый формат Ogg. Это сжатый и открытый формат аудиофайлов. В качестве связующего звена выступает OpenAL или платформозависимые решения.

Network - по названию понятно, что работа модуля связана с сетью и обменом данных. Это может быть TCP\UDP пакеты и в виде готовый протоколов HTTP.

File system - работа с файловой системой. Каждый платформа имеет свои особенности работы с данными. Для многих платформ можно просто обратится к данным со стандартными функциями, в некоторых только с API платформы. К примеру при работе с файлами, которые хранятся в APK - необходимо использовать встроенные функции в NDK.

User interaction - это события от пользователя. Нажатие кнопок или движение и клик мыши. Этот модуль получает от пользователя события.

Platform - это уже целевая платформа на которой будет запускаться движок (игра): iOS, Android, Windows, Linux, OSX и возможно другие варианты. К сожалению Windows Phone уже рассматривать не стоит, хотя платформа была интересная. Каждый движок имеет разный баланс погружения в нативную реализацию. Некоторые движки максимально пытаются отделится от платформы и используют максимально узкую прослойку между системой и движком. Для примера если движок на С++, а платформа iOS - то используемый язык будет Objective C и чтобы реализовать к ним доступ нужно к нужным методам реализовать некоторую обвертку. Некоторые движки пишут большую часть реализации в нативном коде. Например вывод звуков реализована с помощью языка Java для платформы Android, а вызов происходит с помощью нескольких функций.

В следующий статьях мы рассмотрим отдельно модули движка.

{ "author_name": "Anton Nadtoka", "author_type": "self", "tags": [], "comments": 19, "likes": 48, "favorites": 86, "is_advertisement": false, "subsite_label": "flood", "id": 21907, "is_wide": false }
{ "id": 21907, "author_id": 52349, "diff_limit": 1000, "urls": {"diff":"\/comments\/21907\/get","add":"\/comments\/21907\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/21907"}, "attach_limit": 2, "max_comment_text_length": 5000 }

19 комментариев 19 комм.

Популярные

По порядку

Написать комментарий...

Владислав Коваленко

Роман
4

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

Ответить

Nicholas Lagunov

Владислав
1

Говорили за создание интерфейса, а описали жизнь)

Ответить

Sdfal Sdfal

7

Почувствовал себя как будто снова на лекциях. Вроде бы материал и звучит умно, но является абсолютно бессмысленным и непрактичным.

Ответить

Sdfal Sdfal

Sdfal
7

P.S. Ассоциации с заглавной картинкой:

Ответить

Ghar Undefeated

4

Сперва подумал "Может всё таки геймдев, а не офтоп?", а нет, всё верно...

Ответить

Demian

2

С одной стороны, возникает вопрос почему это в оффтопе, а не в геймдеве
С другой, полезность нулевая. Материал уровня "как нарисовать сову". Обычно такое на первых пяти страницах какой-нибудь 600-страничной книги про графику/движки как вводная глава идёт

Ответить

Alexander Zholkovskiy

0

А могли сразу в названии обозначить, что речь про мобилки?

Ответить

Donovan

Alexander
3

А в чем коренное отличие игрового движка для мобилок и для десктопа например?

Ответить

FlyTroll

Donovan
0

оптимизация

Ответить

Donovan

FlyTroll
1

Оптимизация... Оптимизация чего? Физика? Графика? Сетевой код? Работа с ассетами? Если я беру допустим SDL и делаю на нем движок с более высоким уровнем абстракции, где тогда будет разница? На уровне того, что нарисовано в статье может быть хоть движок, который будет рендерить все в HTMLCanvas (что тут оптимизировать конкретно под платформу будем?) так и движок под первую PS.

Ответить

FlyTroll

Donovan
0

шейдеры, GI и т.д

Ответить

Alexander Zholkovskiy

Donovan
0

Лично мне мобилки вообще не интересны, если бы автор поста обозначил бы это в названии, то я бы вообще не стал его открывать, не то что начинать читать. Меня вначале насторожили языки упомянутые в пункте "Game", а вот когда дошел до "Graphics", то сразу стало всё понятно и нафиг закрыл.

Ответить

александр александр

1

Я так понял что игроделы сегодня это бывшие троечники по математике в прошлом

Ответить

Константин Китманов

0

Пример движки LOVE, Corona SDK - разработка игры реализуется на Lua, основной код движка скрыт и не доступен.

Ээ, батенька, не завирайтесь. LOVE как раз-таки опенсорсный и открытый по самые помидоры.

Ответить

Константин Китманов

Константин
1

В остальном же, стиль подачи и детальность информации напоминают лучшие образчики российской словесности: «Россия — наше отечество. Смерть неизбежна. Волга впадает в Каспийское море.»

Ответить

Anton Nadtoka

Константин
0

Тут ошибочка вышла, спасибо. Действительно, LOVE открыт и репозиторий есть на GitHub.

Ответить

Павел Сотников

0

Как-то очень сухо, смотрится как презентация, где автор на слайде показывает лишь основные постулаты, а остальное рассказывает сам

Но вообще круто) Жаль нет возможность подписаться на автора (либо я не знаю как) жду новых и более подробных статей от тебя

Ответить

Комментарий удален

0

Прямой эфир

Подписаться на push-уведомления
[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]