Доработка MitAL и новые подробности разработки демки

Категория: Дневник разработки | Скилл: SkyXEngine | Дата: 17.05.2020
44 день разработки. Звука еще нет, но первые этапы его внедрения в движок уже сделаны. Разработка демки идет полным ходом, но очень медленно с ворохом огромного количества событий и бурной переписки разработчиков вокруг этой темы.

С момента последней записи в дневнике, мне удалось сделать только одну из намеченных задач - оформить низкоуровневую библиотеку работы со звуком MitAL в отдельный репозиторий, сделав ее при этом независимой от кода движка со свободной лицензией MIT. Это было крайне не просто.

Во-первых код звуковой системы буквально "тащил" в высокоуровневые интерфейсы движка низкоуровневую структуру (struct) описания аудиобуфера (там информация о PCM данных). Звуковой системе снаружи вообще не надо знать столько подробностей (про аудиобуферы знать точно не обязательно), но это не большая проблема, а вся загвоздка в том, что интерфейсы звуковой системы при этом становятся завязаны на одной единственной реализации низкоуровневой работы со звуком (в данном случае на библиотеке MitAL).

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

Во-вторых, (по глупости наверное) в MitAL я использовал глобальные переменные RtAudio (на котором построен MitAL) и мастер буфера (эти данные в системе должны существовать в единственном экземпляре). Все было хорошо до тех пор, пока это все не оформилось в dll, а потом DirectSound просто отказывался инициализироваться (хотя с ASIO проблем не возникло), вызов DirectSoundCreate просто засыпал и все. Мне повезло что я вовремя обратился к коллеге, который подсказал что глобальные переменные зло. Проблема была решена переносом глобальных переменных в статические члены класса.

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

Работа со звуком на данный момент остановилась на внедрении кодеков. Интеграция проектов ogg и vorbis доставила хлопот. Сам проект vorbis использует исходники ogg, но это разные проекты, и ogg не является субмодулем vorbis, что усложняет ситуацию. Дело в том, что нам необходимо чтобы весь код, который используется в поставке движка был расположен на нашем хостинге VSC, чтобы быть уверенным что этот код доступен всегда, поэтому мы клонировали эти репозитории с github. Но изменять эти репозитории крайне не желательно, чтобы избежать проблем при приеме обновлений из целевых репозиториев (неважно каких проблем, главное ничего не изменить в реппозитории). Проект для visual studio в репозитории vorbis тянул файлы из внешнего хранилища, и нам это жутко не понравилось. Более того, проект для visual studio в репозитории ogg есть только для 2010 версии, и естественно при открытии более новой версией произойдет конвертация и изменение проектов - изменения в репозитории. В общем, решели этот вопрос созданием проекта для visual studio, который обьединяет весь код ogg и vorbis и выдает одну единственную lib вместо 3-х в стандартной поставке. Репозитории не тронуты :)

А теперь перейдем к самой интересной части - демка. Мы расставили свет, сделали мигающий свет, крутящуюся аварийную лампочку и прикрутили к ней фейковые лучи, красиво, но это было крайне не легко.

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

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

Также по ходу разработки материалов было поправлено освещение, стало лучше :)

Разрабатывая демку мы сталкиваемся в разного рода проблемами движка, которые оперативно исправляем, либо ставим в планы на будущее (в зависимости от критичности проблемы и наличия времени на ее решение). Мне нравится еще и то, что мы уже начинаем развивать игровую библиотеку, внедряя такие игровые штуки как мигающий свет, аварийная лампа. Из запланированных игровых возможностей реализуется крайно мало, но рано или поздно мы доберемся до конца списка :)
Я Виталий, ник в сети Byurrer.
Увлекаюсь программированием, веду интересные проекты, пишу здесь об интересующих меня вещах: о работе, проектах, увлечениях и проффесиональном развитии.

Скилы
php, c++, javascript, sql, hlsl, html, css
Проекты
SkyXEngine, PHP-API, S4G
Категории
В разработке :)
Популярное
В разработке :)