Разработка игры в 1. Хабрахабр. В начале ноября я участвовал в 1. Independent Games Developers Contests (IGDC), темой которого была разработка аркадного шутера с лимитом в 1. Под катом история разработки игры на Open. GL + Free Pascal, эксперименты с LZO, обход багов компилятора FPC для u. FMOD, простейшая генерация текстур и досадный баг на видеокартах NVidia, который все испортил.
27.02.2015 22:02 Выпуск медиаплеера VLC 2.2. 0 Новый модуль для вывода OpenGL ES 2.0 через EGL на платформе Android;; Поддержка прямого код MPEG-DASH, поддержка прямого воспроизведения из архивов (tar, zip, rar).
Видео, бинарник для Windows и исходный код также прилагаются — ищите в конце статьи. Лирическое вступление. Разработка игр — мое основное, любимое и очень давнее хобби. Я кручусь в любительском gamedev без особых успехов, громких релизов и титанических долгостроев около 1. Замороженных проектов много, доведенных до ума — единицы.
В какой- то момент я отчаялся, что у меня ничего не выходит. А потом осознал, что мне нравится не только конечный результат, но и сам процесс разработки игр. С этого момента жить стало спокойнее, но я все еще не отпускаю мысль, что когда- нибудь пересилю себя и выведу какой- нибудь проект на коммерческий уровень.
OpenGL ES (OpenGL for Embedded Systems — OpenGL для встраиваемых систем). OpenGL ES 2.0 Используется в Nokia N900, поддерживается в Symbian. Создать книгу · Скачать как PDF · Версия для печати . Open GL ES, вроде как в комплекте с android и ios идёт, если нет, то обновлять Ось. OpenGL ES (OpenGL for Embedded Systems — OpenGL для встраиваемых систем) — подмножество графического интерфейса OpenGL, разработанное специально для встраиваемых систем. Версия Catalyst 10.8 добавляет ряд функций, включая поддержку OpenGL ES 2.0, повышение качества профилей по умолчанию для просмотра видео, поддержку сглаживания в StarCraft II, улучшенную производительность в quad CrossFire. Под катом история разработки игры на OpenGL + Free Pascal, эксперименты с LZO, обход багов. Создание циферблатов для Android Wear на OpenGL ES 2.0 10k 49 6.
- У разработчика на офсайте, само собой.
- 3DRating for OpenGL ES - это новый вариант бенчмарка от AnTuTu. Это исключительно только одного трехмерного теста производительности нескольких видеоускорителей, которые имеют поддержку OpenGL ES 2.0.
- RK3229 Quad core Up to 1.5GHz Mali-400MP OpenGL ES 2.0 DDRIII 1 zip, rar, tar, html, swf, txt, xls, docx, xlsx, odt Максимальный размер файла 2 МБ.
В какой- то момент я набрел на сообщество IGDC, на котором проводятся короткие (от пары дней до 3 недель) конкурсы по разработке игр на заданную тему. Очень, знаете ли, теплые и ламповые конкурсы, в которых главное — участие, а не приз. Полученный опыт и удовольствие от проделанной работы, а не маркетинг и монетизация.
В наше время, когда порог вхождения в gamedev снизился в разы, и поток откровенно неудачных игр заполоняет мобильные платформы, авторы которых мечтают заработать на безбедную жизнь очередным Flappy Bird. Условия: «Пыщ- пыщ» и враги — именно такими словами Ведущий конкурса охарактеризовал аркадный шутер.
Размер — строго до 1. Срок — неделя. К этим условиям добавляются постоянные обязательные условия: должно работать offline и без установки сторонних пакетов и redistributable. Все, что требуется для запуска игры и не идет в комплекте с системой, должно поставляться вместе с релизом и укладываться в те самые 1. Ограничение неприлично большое для true demoscene (4к, 3. Беглый анализ средств разработки дает довольно внушительный список того, что укладывается в эти требования: Flashhtml. С, C++, C#Delphi, Free.
Pascal.. О Flash. Несмотря на то, что для Flash необходим установленный Adobe Flash Player, он все же разрешен для использования, в качестве исключения (считается, что Adobe Flash Player все же стоит у большинства).
Так сложилось исторически. Но ваш покорный слуга выбрал не самый простой вариант — Free Pascal. Почему не самый простой? Во- первых, в 2. 01. Free Pascal (как и Delphi) считается немодным — как следствие, компилятор FPC имеет мало пользователей и немало багов, несмотря на Open Source и кроссплатформенность.
Во- вторых, размер скомпилированного ехе у связки Lazarus IDE + FPC — повод для отдельной страницы в wiki. В- третьих, очень мало синтаксического сахара, что остро ощущается, когда постоянно используешь много других языков и технологий. Конечно же, есть и плюсы: Правильно приготовленный ехе самодостаточен, при этом сравним с ехе от С/С++ со статической линковкой CRTС настройками по умолчанию, не позволяет выстрелить себе в ногу, как в С/С++С нужными настройками отстреливает напрочь обе ноги (что иногда хочется)Совершенно случайно, у меня уже есть мини- фреймворк на Free Pascal + Open.
GLПоехали! Вакхналия продолжается, пока смерть не разлучит вас с вашим альтер- эго. Ближайший аналог — Crimsonland. Привычным движением откомпилировав шаблон, я создал себе первую проблему — скомпилированный ехе с моим фреймворком с учетом всех хитрых опций компилятора занимал 1. Конечно, с учетом того, что фреймворк умеет (и держа в уме что это все- таки FPC) — это даже достижение.
Но нас это абсолютно не устраивает, поэтому безжалостно режем ехе с помощью UPX — 4. С этим уже вполне можно работать. Конечно, тут еще можно было выиграть несколько килобайт, если урезать функционал фреймворка до самого необходимого. Я от этого отказался по причине нехватки времени, как оказалось впоследствии — не зря. В итоге лимита в 1.
Внедряем LZO. Редкая игра может обойтись без вывода текстовой или числовой информации. Хотя, изначально в моей голове витала мысль создать именно такую игру, но придумать интересную реализацию не получилось.
Поэтому задача — выводить текст на экран силами Open. GL. Не прибегая к архаичному способу вывода векторного текста, следует использовать растровые шрифты (Bitmap Fonts). Мой фреймворк уже имел поддержку вывода текста с использованием заранее сгенерированных и заботливо «запеченых» растровых шрифтов. Задача решена? Коротко о реализации.
Есть собственная велосипедная утилита, которая пакует нужные символы относительно компактно, а затем «запекает» в bmp- файл, в конец которому безжалостно дописывается служебная информация о метрике символов (координаты, размер, оригинальный размер, etc). Любой графический редактор не видит подвоха и вполне корректно открывает файл.
Еще бы научить эти самые редакторы не перезаписывать весь файл целиком при сохранении, и можно было бы накладывать на такой шрифт пост- эффекты. Полученный таким образом файл с русскими и латинскими буквами (плюс спецсимволы и цифры) занимал 1. Убираем русские символы, уменьшаем физический размер самого шрифта, изображение уменьшается вдвое по одному из измерений и, соответственно, вдвое в размере — 6. Но это все равно никуда не годится, так как в сумме с «пустым» проектом это дает ровно 1. Сейчас я осознаю, что наиболее правильным и простым шагом было бы просто взять и генерировать шрифт прямо при запуске, из системного шрифта, благо «копипаст» кода несложен. Более того, в моем предыдущем фреймворке именно так шрифты и генерировались — в «рантайме» из системных шрифтов или otf/ttf файлов.
Но душа хотела романтики, а пятая точка — мучений. И я вспомнил, о том, что товарищ XProger в далеком 2. Mini. LZO, дернув ее дамп и обернув его в несложные asm- инструкции. Выглядит это примерно так, в случае с извлечением: function lzo. Это отлично работает (хотя у меня получилось завести это не сразу), но рекомендовать такое для production- кода не стал бы. Есть легкое неудобство при отладке.
А могли бы и 2- 3 килобайта, если бы я просто внедрил генерацию на лету. Используем u. FMOD для вывода звука. Никто не хочет играть в игры без звуков или, хотя бы, музыки. До этого конкурса у меня был опыт работы с библиотекой bass, однако, ее пришлось оставить за бортом — необходимая dll съедала аж 9. В отчетной теме конкурса упомянули про u.
FMOD — миниатюрную библиотеку для вывода xm- музыки, написанную на ассемблере. Забегая вперед, скажу, что ее внедрение в проект в итоге практически не повлияло на размер ехе- файла. Но был один маленький нюанс. На более- менее современных версиях компилятора FPC (выше 2.
И проблема кроется в неоднозначном поведении линковщика. Сомневаюсь, что смогу максимально верно описать технические аспекты данной проблемы — иными словами почему external- функции, объявленные в заголовочном файле, не видны для подключенного тут же объектного файла. Такое поведение остается на совести разработчиков компилятора.
Приведу пример «обхода» данного поведения для одной из функций. Было так: function wave. Out. Close(hwo: Pointer): Long. Word; stdcall; external 'winmm. А пришлось оборачивать это так: function my.
Уточню, что я взял реализацию u. FMOD через winmm, как самую легковесную и простую в использовании. Из минусов простоты — она позволяла проигрывать лишь один поток одновременно. Тем самым в моей игре появилась музыка, но от звуков пришлось отказаться. Собственно, сам xm- трек взял вот тут, после чего утилитой от u. FMOD превратил его в вот такой pas- файл, что сэкономило мне еще чуть- чуть места.
Генерация текстур. Перефразируя классика — какой demoscene- проект обойдется без генерации текстур? Изначально, я хотел опустить данную тему — уж больно просто и «в лоб» я сделал генерацию целой одной(!) текстуры. Но, быть может, кому- то из новичков пригодится подобный подход. Практически для всех спрайтов в игре используется одна и та же текстура: Просто полосатая текстура с «бордюром» вокруг для большей эстетики.
С учетом color tint (то есть «домножая» нужный цвет на такую текстуру) получаем полосатые текстуры любых цветов. Код генерации мне совершенно не нравится, его явно можно написать более оптимально. Более того, есть стойкое чувство, что бордюр рисуется неверно. TGame. Generate. Texture(a. Width, a. Height, a. Border. Size: Integer): Tglr. Texture. m, m. Задача участников — расставить друг другу места, за исключением себя.
На оценку дается три дня, поэтому после авральной разработки можно расслабиться. Но не тут- то было! Но один за другим конкурсанты отписываются, что моя игра работает у них некорректно — «танк» игрока не виден в принципе, не видны многие вражеские танки, иногда они мелькают. Врагов можно определить только по дыму из выхлопной трубы. Такие проблемы проявляются у всех конкурсантов на видеокартах Nvidia. Более того, один из конкурсантов имеет конфигурацию идентичную моей, но у меня баг не проявляется вовсе. Кому- то помог запуск в режиме совместимости с Windows 9.
Я выкладывал разные билды (что уже слегка противоречит правилам конкурса), подчищая все подозрительные места в коде, советовал разные настройки, но все было тщетно. Наконец, один из участников, самый дотошный, за что ему большое спасибо (привет, pelmenka!), обнаружил причину — если выключить в панели управления Nvidia потоковую оптимизацию (threading optimization), то игра работает корректно. Досада в том, что у меня такая настройка выключена с незапамятных времен, когда она становилась причиной BSOD- а в некоторых играх. Благодаря этой ценной информации, я смог воспроизвести баг у себя и начать устранять его, хотя в душе уже понимал, что большая часть конкурсантов уже проголосовала, да и вообще, я — сам себе злобный буратино, что не проверил игру на стандартных настройках панели управления Nvidia. Я не буду долго описывать процесс поиска решений проблемы. Скажу только, что в процессе поиска, я понял, что: Потоковая оптимизация приносит больше проблем, чем пользы.