Дисклеймер
Здесь статья о том, как мы с друзьями писали игру. Мы ее дописали и продаем, но денег она нам не приносит. Однако, нам было очень интересно и весело ее делать, и я решил поделиться своими воспоминаниями. В статье будет минимум технических подробностей, код я выкладывать не буду, так как учиться на нем бессмысленно. Это код любителей, а не профессионалов, там ошибка на ошибке. Никто из нас не имеет АйТи образования и никто профессионально никогда не занимался программированием. Я иногда буду выкладывать технические подробности, так как без этого никуда. Прошу читателей также не постить коментарии о том, какие мы лохи, так как это обидно читать. Хоть и правда.
Другие части статьи
Часть 2
Часть 3
Глава 1. Доисторические события
Времени прошло много и я уже не слишком хорошо помню мелкие детали, однако я точно помню, что пришел домой позже обычного и был довольно уставший, когда увидел звонок Федора Михалыча. Пропущеный.
«Перезвоню завтра», — подумал я.
Федор Михалыч всегда был сердцем нашего проекта. А был как-бы мозгом, хотя, это было не совсем верно тоже. Я был руками, наверное. Навреное, я был, скорее, бэк-офисом. А Федор Михалыч – фронтом. Поэтому он всегда фонтанировал идеями. А я всегда грубо обрывал полет его мысли:
— Федор Михалыч, это невозможно, для этого надо будет переделать все в движке, и поменять половину эссетов. И это уже не говоря о том, что идея сама идиотская, мне не нравится, — так я потом буду отвечать на звонки Федора Михалыча, чтобы через несколько недель воплотить его идеи в коде, позвонить ему, и сказать, что я придумал и написал крутецкую штуку… Но это будет потом.
До этого оставалось еще около года. А пока мы думали, что писали ММОРПГ.
ММОРПГ мы начали писать как-то вдруг. Ни я, ни Федор Михалыч, ни Димон, никогда в жизни не занимались профессионально программированием вообще, не говоря о разработке игр. Все мы работали в банке, Димон торговал валютами, я – долгами, а Федор Михалыч занимался поддержкой торгов. Причем Димон с Федором Михалычем работали в одном банке, а я – в другом. Но мы были игроманами. Мы хотели писать игры. Я «баловался» программированием еще со школы, когда-то давно я, с помоью книжки Андре Ламота «Программирование игр под Windows», писал на Си клон игры Wolfenstein, писал четко по книжке, но мой компилятор не умел встраивать ассемблер в код Си, поэтому, в отличие от книжного варианта, мой движок работал ну очень медленно. Потом я долго не занимался программированием вообще, пока, однажды, в одном книжном магазине, мой взгляд не упал на книгу «Программирование 3Д игр под Windows» Андре Ламота.
«Дежа вю», — подумал я по-французски. Так как я работал во французском банке, мне иногда приходлось так делать.
Но это была совершенно другая книга. Я ее полистал и понял, что это то, что нужно. Я хотел ее. Я хотел делать то, о чем в ней говорилось. Я позвонил Федору Михалычу и предложил ему написать 3Д игру. И он согласился.
Жена приготовила очень вкусный ужин, но я очень устал и молча ковырялся в тарелке. Я думал о том, почему код не собирается. Было лето и на работе было скучно. Я даже тоскал с собой ноутбук, чтобы заниматься игрой в свободное время. Летом на рынке никого не бывает, и свободного времени на работе полно. А код не собирался потому, что глобальные переменные у меня были задекларированы в .h файле, и он был включен в несколько .c файлов. И компилятор ругался на редефенишн.
#ifndef file_h
#define file_h
Придет потом. А пока я изобретал свой вилосипед. Я их очень много изобрел. После прочтения книги Ламота мне казалось, что я могу все. Я принялся за изучение OpenGL и оказалось, что, в общем-то, мне даже писать ничего не надо (это был фиксированный конвеер, да. О том, как работают шейдеры, и что писать мне надо много, я узнаю потом). Я быстро наваял корявую ходилку по поверхности в 2Д мире от первого лица (мир виден в 3Д, но движок не умел обрабатывать перемещения по высоте, то есть, по факту, все было 2Д, как в Вольфе). В книге был подробный разбор фоматов md2 и obj, и я надергал моледек из 2го Квейка и из интернета. Все было хорошо, но из-за ошибок, подобных приведенной выше, код мог внезапно перестать собираться после небольших изменений. А мог не перестать. Я часто ломал голову над этим в то время, и часто изобретал велосипеды.
И да, я писал движок для нашей ММОРПГ. А Федор Михалыч с Димоном отвечали за почти все остальное. Я чувствовал себя Джоном Кармаком. Мне было хорошо. Но прогресс шел медленно. И Федор Михалыч постоянно звонил. Вот и сейчас. Надо бы ему перезвонить.
Я поблагодарил супругу за ужин и налил себе вина. Надо поговорить с Федором Михалычем. Супруга смотрела на меня волком. По ее мнению, мне надо было поговорить с ней. Но долг превыше всего.
— Привет, Федор Михалыч, звонил?
— Паштет, бросай эту лабуду, которую ты пишешь, мы занимаемся херней!
— ???, — конечно, я ответил не так.
— Надо писать игры для айфона. Будущее за мобильным геймингом.
Надо сказать, Федору Михалычу не первому пришла эта мысль в голову. Аппстор активно рос. Начали появлсяться большие проекты, но места на рынке было много. И все туда стремились.
— Окей. Давай подумаем.
— Нехрен думать. Давай игру делать. Только что-нибудь попроще, не ММОРПГ, а то мы до пенсии ничего не допишем. А надо уже релизить сейчас, пока поезд не ушел.
— Ну я хочу писать в 3Д. Как на айфоне играть в 3Д?
— Забей, — Федор Михалыч был очень настойчив. – Давай писать не 3Д. Давай подумаем над жанром.
— Думай. Ладно, давай я посмотрю что там как. Поставлю Икскод и гляну. Я когда макбук себе купил, увидел, там на диске с ним шел бесплатно икскод. Вроде норм среда.
— Отлично. Я тебе на почту скинул ссылки по сайтам с обучалками по программированию под айфон. Особенно мне понравился какой-то Рей Вендерлич. Посмотри.
— Хорошо.
Примерно так я окунулся в мир мобильной разработки. Без профильного образования, без знания ООП, без идеи, что же разрабатывать. А первой моей мыслью, когда я открыл обучающий сайт по программированию для айфона было «какой идиотский синтаксис». Примерно этими словами я и сейчас описываю Objective C.
Дальше было веселее. Оказывается, мои привычные
GLBegin(GL_TRIANGLES);
GLVertex3f(…);
GLend();
На айфоне не работали. Не работали и GLTranslatef и т.п. глупости.
— Окей. Я не зря Ламота читал, я знаю, как это работает, — думал я. И писал.
Где-то чезез пару дней я разобрался с Vertex Array Objects и как с ними работать в шейдере. Еще с неделю у меня ушло на создание проекта, где можно было двигать по экрану кубик с анимированной текстурой. Больше всего времени уходило на рисование серий текстр для анимации. Спрайтов. Примерно через две недели у меня был готов маленький платформер. Я его назвал Agent Ivan, в честь моего будущего преподавателя по Ивриту.
Все это время Федор Михалыч напряженно думал. Дело в том, что, по его мнению, платформер писать смысла не имело. Это было примитивно.
— Это примитивно, — говорил он. – Вот бы что посерьезнее. Ты, кстати, слышал, что собираются переиздавать УФО на компе?
— Икс-Ком?
— Да.
— Давно пора. Классная игра была. Кстати, отлично подошла бы под тач-интерфейс. Ее на айфоне будут выпускать?
Федор Михалыч задумался.
— Давай.
Теперь задумался я.
— Давай сделаем Икс-ком? У нас прав нет.
— Ну, клон. Не сам икс-ком. Они выпустят на компе, а мы под шумок на айфоне.
Это было интересно. Нам обоим очень нравился Икс-ком. Тогда мне казалось, что создать клон Икс-ком – не сложно. Сложнее платформера, конечно, но не сильно. За полгода должны справится. Если повезет, релизнемся на айфоне до того, как выйдет ремейк на ПК. Будет круто. Будет весело. И, главное, это не большой проект. Если я платформер сделал с нуля за 3 недели, то Икском – это месяцев 6. Умножаем сразу на 2, чтобы не расстраиваться, итого – год. Круто.
Глава 2. Начало времен
Мы загорелись. Я писал код, Димон делал текстуры полов и работал с фрилансерами, которые делали модельки в формате md2. Кроме самих солдат, за которых отвечел фрилансер, с которым работал я. Ну, а Федор Михалыч думал над структурой игры, сюжетом, оружием, архитектурой уровней, балансом, и вот этим вот всем.
Но, самое главное, я писал движок на OpenGL, как я и хотел.
Сначала было трудно. Большую часть времени я учился писать на Objective C и OpenGL. Меньшую – писал саму игру. Но со временем я втянулся, и где-то через месяц по квадратному текстурированному полю у меня бегали за пальцем анимированные монстры из Квейка 2 в симуляторе айфона (наши модели еще не были готовы). Федор Михалыч подгонял историю под игру:
— Будет будущее, но недалекое. Мир во власти корпораций. И теракты тут и там, внезапно, весь мир в терактах.
— Теракты, — это плохо, — отвечал я.
— Ну, само собой, в этом и суть. А ты будешь с ними бороться.
— Бороться, это хорошо, — отвечал я. — Но скучно. Это тебе не по элиенам палить.
— Ну и что. Можем и по элиенам. Как хотим, так и сделаем, это наша игра.
— По элиенам не можем, это будет икс-ком. А по человекам не интересно.
— Давай по животным, — не унимался Федор Михалыч. Ему бы лишь бы по кому-нибудь попалить.
— Животных жалко, — отвечал я.
— Ну давай по мерзким животным.
— А может, они в душе добрые?
— Вот, правильно мыслишь. А что, если это няшные животные в душе злые?
— В смысле? – я тогда действительно не понял.
— Ну вот, взять Гринпис. Защищает он, допустим, пингвинов, от вымирания.
Я немного опешил:
— Когда это пингвины начали вымирать? – я даже полез в Википедию. Нет, все в порядке, не вымирают. – Не вымирают, — сказал я вслух и ткнул пальцем в экран.
— Да успокойся ты, — ответил Федор Михалыч, — надо будет, начнут вымирать. Ты в идею вникни. Спасают их от вымирания, путем создания мутанта пингвина с человеком, чтобы прибавить им разума, и чтобы они перестали вымирать сами.
— Эксперименты над людьми запрещены, — парировал я.
— Именно, — не унимался Федор Михалыч. Допустим, кто-то пронюхал это, и его убили. И инсценировали теракт. А кто-то догадался, и его тоже убили, как теракт. Потом сделки с террористами пошли, торговля оружием, хьюман траффикинг, и все это – под эгидой Гринписа, чтобы скрыть эксперименты над людьми-пингвинами.
— Глубуко, — сказал я.
— Ну вся эта машина террообмана набирает обороты и уже запускается самоподдерживающаяся реакция, сечешь, о чем я?
— Секу, — я правда сек. Я до сих пор секу.
— Отлично. Вот и получается, что ты вроде в людей палишь, а там сзади мутанты-пингвины и все вот это вот. Это интересно? – Федор Михалыч меня убедил. Мне правда это казалось интересным.
Я назвал очередной билд проекта «pinguin» и взялся за оттачиваение кода. Димон накидал около сотни различных текстру пола, травы, бетона и прочего. Федор Михалыч тоже занимался текстурами. Я в коде генерировал модель пола, состоящую из квадратов. Каждый квадрат – со своей текстурой. Грузил в память кучку моделей и показывл Федору Михалычу, как все весело следует за пальцем по экрану. Тем временем, подоспела первая модель нашего солдата от фрилансера, и я ее добавил вместо монстров из Квейка 2. В нескольких экземплярах.
Но однажды Федор Михалыч сказал, что надо бы посмотреть, как все на устройстве работет. И я купил себе подписку разработчика. Какое-то время заняла настройка всех сертификатов. Для меня это был темный лес, однако Федор Михалыч справился быстро. Мы закачали проект в телефон, запустили, пошла загрузка… и приложение упало.
Непонято.
Я запустил билд в эмуляторе – работет.
То же билд на реальном устройстве – падает.
Пора обратиться к дебагеру.
Уже в то время в икскоде было все относительно неплохо с дебагом. Я запустил профайлер и начал смотреть на приложение.
— Как-то много памяти уходит, Федор Михалыч, смотри. У нас 20 уродцев по квадратному полю ездит а она уже 150 МБ съела… 200… 250… 300… упало. – Я подумал. — Давай считать. Мы создаем пол. Это 128х128 квадратов. У каждого 4 вершины, это 16 тыс вершин. Каждая состоит из 3х координат и 2х текстурных координат, это все флоаты. Итого 82 тыс флоатов. И каждый флоат – 4 байта. Итого 320 Кб. Немного, да?
— Немного, — согласился Федор Михалыч.
— Дальше мы грузим текстуры ваши с Димоном. Их у нас сейчас 20 штук. Каждая 512х512 и 32 бит цвет. Итого 1 МБ на текстуру, 20 МБ выходит. Немного, да?
— Немного, — согласился Федор Михалыч.
— Дальше мы грузим модельки наших солдатиков. Я их гружу 20 штук. Каждая из 2 тыс полигонов, каждый по 3 вершины, каждый по 5 флоатов, каждый по 4 байта. Итого… 2,35 МБ. Немого?
— Немного, — согласился Федор Михалыч.
— Хотя нет. В каждой модели по 95 кадров. Итого 220 МБ.
— Ага, — согласился Федор Михалыч, — и текстуры на них. 1024х1024 32 бит. Итого 80 МБ. Всего за 300 МБ выходит. И это только плоское поле и 20 уродцев. А в игре будет сильно больше врагов на уровне. И всякие объекты. В симуляторе ограничения на объем памяти нет считай. А в айфоне ее 512 МБ. Часть занимает система, тебе остаются понты.
Я был опустошен. Такими темпами, чтобы загрузить уровень, придется ждать выпуска айфона с 5-10 ГБ памяти. Но как? Как Кармак сделал Квейк???
Комментарии (19)
SantaCluster
02.02.2018 16:25это точно не художественное произведение? не сказка? читается, прям, как рассказ Николая Носова про живую шляпу :) Очень легко и увлекательно, продолжайте в том же духе, жду продолжения!
lgorSL
02.02.2018 18:10+1Дальше мы грузим модельки наших солдатиков. Я их гружу 20 штук. Каждая из 2 тыс полигонов, каждый по 3 вершины, каждый по 5 флоатов, каждый по 4 байта. Итого… 2,35 МБ. Немого?
— Немного, — согласился Федор Михалыч.
— Хотя нет. В каждой модели по 95 кадров. Итого 220 МБ.А почему бы не навелосипедить
свою склетеную анимациюинтерполяцию между ключевыми точками?old_gamer Автор
02.02.2018 18:49+1Интерполяция, само собой, была. Без нее анимация была бы очень дерганной, хотя по началу она такой и была.
Количество кадров в модели — это именно количество ключевых кадров, по 7-10 кадров на анимацию. Просто разных анимаций было много: стоим, садимся, сидим, больно стоя, больно сидя, умираем стоя, умираем сидя, стреляем стоя, стреляем сидя, идем… Возможно, что-то еще забыл.
Скелетная анимация, безусловно, решила бы эту проблему. Если бы молодость знала ))
В то время, когда я освоил скелетную анимацию, все модели были уже готовы в вершинной, и переделывать их было бы долго и дорого, так как делали их не мы.david52522
03.02.2018 14:04+1Не проще было бы подгружать модельки с диска по мере необходимости? А для покрытия — «туман войны», за которым модельки не отрисовываются, а только обсчитываются. Тогда вместо 20 уродцев было бы в худшем случае 9-12, а это бы уже влезло «впритык». Или я чего-то недопонимаю?
old_gamer Автор
03.02.2018 14:08Какая-то разумная схема кэширования моделей, безусловно, решила бы все проблемы, однако в итоге мы пошли другим путем, изобретая свой велосипед. Ну и, так как скорость чтения с флеша у старых айфонов была довольно низкая, подгружать все надо было в фоне, а это означало написание многопоточного движка, чего мне тогда в голову просто не приходило.
DollaR84
03.02.2018 14:04Продолжайте конечно. Читается очень легко и увлекательно. Если не читать вначале о том, что это история из жизни, то вполне можно принять за юмористический рассказ :-)
barbanel
Класс!) Продолжайте, интересно к каким оптимизациям вы пришли в итоге.
А я в свое время писал свой 3Д движок на Delphi, безумно радовался когда удавалось наконец реализовать новую фичу) Теплое ламповое время!