Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Битва за Веснот

Глава 25 из 1 тома книги "Архитектура приложений с открытым исходным кодом".

Оригинал: Battle for Wesnoth, глава из книги "The Architecture of Open Source Applications" том 1.
Авторы: Richard Shimooka и David White
Перевод: Н.Ромоданов

25.1. Обзор проекта

На момент публикации настоящей статьи базовый движок Wesnoth, написанный на языке C++, состоял примерно из 200 000 строк кода. Сюда относится игровой движок, представляющий собой примерно половину это кода, не содержащего какого-либо контента. В программе также можно задавать игровой контент при помощи уникального языка описания данных, известного как Wesnoth Markup Language (WML). Игра поставляется вместе с еще 250 000 строками кода на языке WML. На протяжении времени существования проекта это соотношение менялось. По мере того, как программа совершенствовалась, игровой контент, который был жестко запрограммирован на C++, всё больше и больше переписывался таким образом, чтобы для определения действий программы можно было использовать язык WML. На рис.25.1 приведен общий вид архитектуры программы; областями серого цвета выделены те части, которые поддерживаются разработчиками проекта Wesnoth, а те, которые выделены белым, являются внешними зависимостями.

Рис.25.1: Архитектура программы

В целом, в большинстве случаев проект старается минимизировать количество зависимостей с тем, чтобы увеличить переносимость приложения. Преимуществом этого является уменьшение сложности программы, а также то, что разработчикам не требуется изучать нюансы большого количества интерфейсов API, разработанных третьими сторонами. В то же время, осторожное использование некоторых зависимостей может, на самом деле, помочь добиться такого же эффекта. Например, в Wesnoth используется слой Simple Directmedia Layer (SDL) для работы с видео, с вводом/выводом и для обработки событий. Слой SDL был выбран за то, что он прост в использовании, и в нем предоставлен обычный интерфейс ввода/вывода, реализованный для многих платформ. Это позволяет обеспечивать переносимость множество платформ, а не кодировать на различных платформах альтернативные варианты для конкретных интерфейсов API. За это приходится платить, т.к. это оказывается сложнее, чем пользоваться преимуществами некоторых специальных возможностей, имеющихся в ряде платформ. В SDL также есть семейство дополнительных библиотек, которые в проекте Wesnoth используются для различных целей:

  • SDL_Mixer — для микширования аудиосигалов и звука
  • SDL_Image - для загрузки изображений в формате PNG и в других форматах
  • SDL_Net - для работы с сетью

Кроме этого, в Wesnoth используется несколько других библиотек:

  • Boost - для различных передовых возможностей языка C++
  • Pango и Cairo - для использования шрифтов различных языков
  • zlib - для сжатия данных
  • Python и Lua - для поддержки работы со скриптами
  • GNU gettext - для использования разнообразных языков

Повсюду в движке Wesnoth используются объекты WML, т.е. практически повсеместны строковые словари с дочерними элементами. Множество объектов может создаваться из элементов WML, а также может быть сериализовано в элементы WML. В некоторых частях движка данные хранятся в таком формате, который базируется на словарях WML, причем они непосредственно интерпретируются, а не преобразовываются в структуру данных языка C++.

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

  • Синтаксический анализатор языка WML с препроцессором.
  • Базовые модули ввода/вывода, абстрагирующие библиотеки и системные вызовы, лежащие ниже — модуль работы с видео, модуль работы со звуком и модуль работы с сетью.
  • Модуль графического пользовательского интерфейса, содержащий реализации виджетов кнопок, списков, меню и т.д.
  • Модуль отображения - для прорисовывать игрового поля, юнитов, анимации и т.д.
  • Модуль искусственного интеллекта.
  • Модуль поиска путей, в состав которого входит много вспомогательных функций, используемых для работы с игровым полем, состоящим из шестиугольников.
  • Модуль генерации карт - для генерации произвольных вариантов карт различного вида.

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

  • Модуль титульного экрана - для показа титульного экрана.
  • Модуль сюжетной линии - для показа роликов-вставок.
  • Модуль главного меню игры - для показа и подключения к играм многопользовательского сервера.
  • Модуль «play game», который контролирует основной ход игры.

Модуль «play game» и основной модуль отображения являются самыми большими в Wesnoth. Их назначение определено наименее четко, поскольку функции меняются постоянно и для них сложно составить четкую спецификацию. Поэтому в течение всего времени существования программы для этих модулей часто возникал риск их реализации в виде антипаттерна Blob, т. е. превращения их в громадные доминирующие сегменты без строго определенного поведения. Код в этих модулях регулярно просматривается с целью определить, можно ли какую-нибудь из его частей выделить в отдельный модуль.

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


Продолжение статьи: Wesnoth Markup Language - язык разметки Wesnoth