LG.BALUKATION's Weblog

Ничего, это тоже кое-что… А при желании из него можно сделать что угодно

Work in GameDev — 10th Anniversary

Posted by LG.BALUKATION на 2017/11/16

Я тут немного проворонил круглую дату, но оказывается прошло уже 10 лет, как я связался с разработкой игр за деньги.

Кто-то в 2007 году угорал по эмо и виноградному дню, я же тем летом получил диплом техника по программному обеспечению ЭВМ и автоматизированных систем, съездил на почти месяц в окрестности Анапы, вернулся в Питер и начал искать работу.

Хотя и были вялые попытки пойти учиться дальше на бакалавра, наука и учёба меня не прельщали — я ливнул даже не дойдя на экзамены в универ. Ещё в детстве для меня открылся сказочный мир 8 и 16-битных игр, а к середине школы я записался в местный кружок информатики. На кружке сперва была всякая фигня вроде M$ Office 97 (Word, Excel, PowerPoint и даже Access но без SQL), потом пошёл паскаль. Паскаль однажды дошёл до графики и тут я заметил, что эта штука может быть не просто смесью калькулятора и пишущей машинки, но вполне себе можно простенькие игры брать и делать самому.

В студенчестве были самостоятельные ковыряния SDL и OpenGL (без шейдеров), т.к. лекции нам читали только по общему курсу программирования. На втором курсе часто сидел за одной партой с челом, который любил ковыряться в редактор Morrowind’а (привет, Серёга!) — так я заметил, что и ААА игры вполне себе доступны на определённом уровне. Для Морровинда я написал несколько простых скриптов, но мой коллега вылетел с учёбы и его забрали в армию — так закончился наш моддинг. Посматривал ещё на NWN и некоторые другие игры, но возится с редакторами карт мне было не интересно — так что постепенно забросил всё это.

Итак, в 2007 я доучился до какой-то формальной корочки, с которой можно было смело класть на дальнейшее студенчество и топать искать нормальную работу. Я порегался на хедхантере (модный в рунете сайт по поиску работы среди новичков), написал там что-то и сам листал вакансии по словам вроде «игры», «C++» и «opengl».

Что забавно, меня звали в Calculate. Я тогда ещё не знал что это такое — нагуглил, что они коробки делают и подумал какая-нить офисная скукота вроде эникея будет, даже не ответил. А спустя годы выяснилось, что они делают неплохую сборку на основе Gentoo Linux (мой любимый дистрибутив линукса во времена школы и студенчества) и я даже ставил несколько их сборок себе на нетбук и отцу на десктоп.

Mobile Post Prosuction (октябрь 2007 — апрель 2011)

Вскоре я получил вот такое письмо:

Собеседование было забавным.

Во-первых я понял, что не знаю толком C++. Там был тест на сколько-то вопросов в стиле «что делают эти 10 строк кода, выберите правильный вариант», из которого я правильно ответил лишь на треть. Но оказалось, что это нормально для новичка — у них этот тест для всех, он сложный и многие нюансы знает только народ с опытом.

Во-вторых оказалось, что работы на C++ у них тогда не было. Я уже было расстроился, но мне предложили вместо испытательного срока просто ходить в офис, скачать какую-нить книжку по Java, читать её и смотреть что делают остальные. И если я через месяц смогу начать как-то фиксить простенькие баги, то в общем-то и сойдёт.

Про языки программирования небольшое отступление — сейчас все нормальные игровые движки пишутся на C++ и потом сверху оборачиваются тонким слоем Java для Android и Objective-C для iOS, а для скриптов сборку прикручивается что-нить вроде Lua, JS или C#. Т. е. обычно есть общая технология, которая работает везде одинаково и её просто затаскивают на очередную платформу. 10 лет назад всё было не так — телефоны на JavaME хотели игры целиком и полностью написанные на Java, а некоторые другие платформы (например, BREW) поддерживали только C/C++.

Кроме разности языков программирования в телефонных платформах, не было единства и между самими телефонами. Разрешения экранов, коды клавиш, поддерживаемые API и форматы для звуков/музыки, способы обработки переключения задач и даже регионы — разница во всём этом требовала делать для каждой игры сотни разных билдов.

Их заказывали у контор, вроде той где работал я — присылали «эталонную версию» игры (работающую в эмуляторе или на каком-нить хорошем телефоне вроде SonyEricsson) и список из множества моделей телефонов. У нас в офисе было два сейфовых шкафа, полных всяких разных телефонов и общая с другими офисами (кроме Питера, был ещё Таганрог, Таллин (Эстония), Феникс (США) и где-то в Канаде) вики с данными об особенностях каждой модели. Хорошо, если нужный телефон был в Питере — тогда его можно было взять и самому посмотреть что да как, иначе приходилось делать море итераций тестирования в других странах.

Отладки и логов на устройстве, как правило не было. Т. е. конечно же нормальные телефоны позволяли установить SDK, подключить провод и смотреть что да как, но они обычно и не глючили. А то, что глючило, чаще всего не позволяло ни отладку ни запись логов. Так что приходилось извращаться самим:
* вместо скриншотов, тестировщики фотографировали экран одного телефона другим, ну или записывали видео как что делается
* мы часто писали вывод всяких переменных прямо поверх игры, начиная с банальных счётчиков fps и памяти до вещей специфичных для логики каждой конкретной игры
* исключения тоже самим обычно приходилось показывать в виде всплывающих уведомлений или чего-нить подобного
* вместо логов иногда использовали слот сохранения. Например, игра запускается и пишет в сейв что-нить время-от-времени, а на следующий запуск вместо игры рисует текстовое окно с содержимым этого сохранения.

В общем, основой процесса были медитация над кодом, отладка кода в эмуляторе идеального телефона (где всё и так работало), попытки понять что же не так и расстановка «ловушек» в соответствии с выдуманной теорией.

Не смотря на шуточки джавистов о ненужности препроцессора, его мы активно юзали. Конечно, можно было на каждый телефон копировать и переделывать весь проект, а можно было просто завести кучу дефайнов и дальше телефон уже описывать в рамках этих дефайнов — такой-то экран, такие-то коды клавиш, так-то реагирует на звонки/смс и т.п. Получается код у игры как бы один, просто некоторые места в этом коде написаны в десятке вариантов и при сборке выбирается нужный.

Отдельной проблемой были сами требования телефонов к софту — нынешний смартфон имеет многоядерный процессор, несколько гигабайт оперативной памяти и относительно мощную видеокарту. В те времена процессоры были одноядерные и медленные, оперативная память исчислялась килобайтами (пара мегабайт — считалось уже весьма не дурно), а на многих простеньких моделях было ещё ограничение на размер устанавливаемого дистрибутива. Т. е. если архив с игрой «весит» больше, чем сколько-то килобайт — телефон просто отказывался его устанавливать.

В общем, оптимизировали и резали тогда игры как могли. Сами игры были похожи на обычные игры из эпохи 16-битных приставок, что на мой взгляд было не так уж и плохо. Фритуплея ещё не существовало, покупатель платил один раз за покупку игры, так что современные «сосалки» тогда ещё не делали. Патчи и дополнения обычно тоже не делали — так что проект должен был пройти как внутренний контроль качества (наши тестеры проходили игру вдоль и поперёк), так и внешний (издатель проверял билды перед приёмкой).

И да, про все эти ограничения и ухищрения — это был закат эпохи кнопочных телефонов, вскоре все переключились на iPhone/Android где всё стало уже совсем по-другому.

На той работе я участвовал в 18 проектах для «звонилок» и ещё паре для iOS/Andorid — это было жутко интересно.

Giraffe Entertainment (лето 2011)

iOS/Android вытеснил остальные смартфоны с массового рынка, все стали клепать игры на эти две платформы и больше не нужна была толпа людей на портирование, т. к. модных моделей было всего-ничего, а на немодные издателю было плевать. Прошлый мой работодатель устроил сокращение штата и продался крупному издателю (от которого и раньше была уйма отдельных проектов). Как в подобном посте (http://torick.ru/moi-desyat-let-v-igrovoj-industrii/) выразился Святослав Торик — при затягивании поясов, я «стал одной из тех дырочек, что остались снаружи».

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

Жираф оказался семейным стартапом. Основатель работал раньше над большими играми, а потом вместе с братом и отцом собрались портировать казуалки на планшеты. Портировали-портировали и надумали начать делать свои казуалки. Для этого им нужен был художник, гейм-дизайнер и выделенный программист. Наработки в виде недопиленного движка с редактором графов у них были — меня наняли это дело допиливать, потом нашли художника и гейм-дизайнера. Художника впрочем сразу переключили на правку графики для портов чужих игр, да и мне через какое-то время поручили для пробы портировать флешку на C++ и этот движёк (в дополнение к нашей собственной игре, которую я делал на нём изначально).

Похоже, ребята не потянули финансово, т. к. сперва они перестали искать ещё одного программиста в команду, потом уволили дизайнера, ещё через месяц меня и под конец осени просто растворились.

Хотя проработал я там не долго, но это было познавательно — я впервые делал что-то новое, а не переделывал уже готовое. Плюс, кроме движка и игры (сжатие и атласы текстур, покадровая анимация, скрипты на питоне и цмейке для готовки и сборки всего этого), я же занимался и редактором — где уже совсем другие цели и средства, нежели в игре.

Забавно было ещё, что у них был фиксированный рабочий график. Ещё во время всяких преддипломных практик я привык ходить ко второй смене и спать до полудня, на первой работе график был свободный и я продолжил там появляться к обеду, а тут нужно было ходить к 10 утра. За всё время, я так ни разу и не смог приехать в такую рань в офис, постоянно опаздывая на полчаса-час. После испытательного срока, думал меня просто не возьмут, но никто меня не прогнал и попросили лишь звонить если буду сильно задерживаться (что я не делал, т. к. часам к одиннадцати всёж добирался на работу). Уходили тоже непривычно рано, в шесть часов объявлялся конец рабочего дня, типа нефиг по вечерам в офисе торчать — бросайте всё и расходитесь, завтра доделаем.

Из двух игр, над которыми я там работал, так ни одна и не вышла.

Nevosoft (сентябрь 2011 — декабрь 2012)

Ещё во время прошлого поиска работы, я присмотрел несколько потенциально интересных фирм. Среди них был и Nevosoft, но их HR тогда была в отпуске и пока её не было — я устроился в Giraffe. Giraffe разваливался за считанные месяцы, а HR вернулась из отпуска и можно было договариваться о собеседовании.

Впервые я писал нормальное тестовое задание. Т. е. не задачку уровня «сложи два числа» (или посложнее, но главное что бы задание было лишено практического смысла), а небольшую игру — что-то вроде «пятнашек».

В отличии от тестового задания, про собеседование сказать хорошего мне нечего. Раньше я не имел дел с отдельными HR, общаясь лишь с техническими лидами, которые искали народ в команду себе или вроде того. Тут же был ещё и отдельный человек, который ничего не понимал ни в программировании, ни в проектах на которые берёт людей — было море воды типа «а что вам инересно, какое у вас хобби» и прочая вода. Мы с руководителем отдела сидели фейспалмили от всей этой чуши, ещё несколько месяцев спустя мне пришлось повторить всё это уже в роли собеседующего — по-прежнему 2/3 времени уходило на обязательную частью общения ниочём. К счастью, на втором туре собеседования был только совладелец фирмы, так что разговор шёл нормально — он не брезгует заниматься разработкой сам, так что знает что-к-чему и не несёт чушь.

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

С другим программистом мы работали на равных, т. к. он занимался следующей частью игры для компа, я же завершил портирование последней готовой части на iPad, сделал патчи и багфиксы двух уже портированных на iPad частях той игры и начал отдельную мобильную версию для iPhone. Конечно, поначалу я у него много что спрашивал об устройстве игры и движка, но наши задачи слабо пересекались и это больше философские беседы были. Так что какая-то часть из предложенных мной изменений была сделана и в «большой игре», а какие-то её новшества были реализованы и в «меленькой».

Отдельной «маленькая игра» была по тому, что это был не порт чего-то готового, а именно новая и самобытная игра в серии. Так же это игра была для телефонов (с компа версии портировали только на планшеты), но этот нюанс больше касался дизайна игры, чем её технической части.

Будучи единственным программистом на игре, я делал там всё — фиксил баги, допиливал движёк, реализовывал новые фичи и поддерживал редактор. К сожалению, код был стар и не опрятен (разделения на движёк и игру не было — годами просто копипастили всё и переделывали это в новую игру), так что я старался причёсывать его, устраивая время-от-времени набеги рефакторинга.

После самого сложного момента, когда я одновременно и зарелизил одну часть, и сделал обновки для двух других, и выкатил очередной майлстоун новой игры, мне взяли помощника. Это было странно, т. к. я просил о нём до выхода старых частей, сейчас же работы стало в разы меньше и реальной надобности в нём уже не было. Так что я стал давать ему заниматься рефакторингами. Взгляд у него был ещё не замыленный проектом, что и как работает он пока не знал — я брал что-нить, что хотел улучшить, показывал и объяснял как оно работает сейчас, рассказывал как бы я хотел, что бы оно работало и почему я бы хотел, что бы оно работало именно так. Если у помощника не было идеи получше, он причёсывал наш проект. Сроки у него были не ограничены, так что мы много обсуждали, что там как устроено и пути улучшения, пока он не освоился во внутренностях игры и не стал способен сам заниматься написанием новых игровых фич.

В своей работе я видел и пару больших проблем — это планирование и качество.

Планы на игру были для меня тёмным лесом — я не знал когда она должна выйти, в каком виде и т. п. Мы время-от-времени собирались с продюссером, накидывали задач на ближайший малстоун, определяли из этих задач дату его сдачи и расходились работать. Где-нить в середине срока продюссер выкидывал какие-то фичи, добавлял новые, сроки переставали соответствовать планам и вообще было не понятно в каком состоянии проект. Он мог быть на вид вполне готов, но вдруг начнётся его полная переделка и это будет уже другая игра, которую придётся снова доводить до рабочего состояния какое-то время. Работа в таком режиме кажется очень рутинной, потому что есть много действий но нет ощущения прогресса.

После первой работы, меня удивило отношение к качеству. Команды тут были маленькие, выделенных тестировщиков в них не было, так что качество было на уровне самодеятельности. У проектов не было системы сборки — только файлы для IDE и негласные правила что как делать с данными (жать, конвертировать, куда что копировать и т. п.). Я хотя бы батники себе написал и начал гонять их каждое утро, что бы у дизайнера и художника всегда были более-менее свежие версии игры и редактора. О нормальной истории ошибок не было и речи — проекты давали погонять всем кому не лень ближе к релизу, исправляли найденное и выкладывали в магазин. К счастью, однажды там на пол-годика появился толковый тестировщик и он поставил хоть какой-то процесс проверки билдов. Но т. к. отдел тестирования был тогда в зачаточном состоянии и очень малочисленный, билды проверялись (вручную) лишь перед важными этапами, а не каждый день. Я начал задвигать идеи типа «давайте потратим немного времени и сделаем нормальную систему автоматизированной сборки», но был задвинут — дескать нужно игры писать а не хрень всякую придумывать.

За время работы, я успел поработать над одной серией игр, зато больше или меньше притронулся ко всем пяти играм в ней.

Saber Interactive (январь 2013 — наши дни)

Осенью 2012 тянулась скучная полировка проекта, а идея наладить нормальную инфраструктуру для разработки была отклонена. В то же время, Сайбер искал человека для развития этой самой инфраструктуры и кое-кто там знал, что это может быть интересно мне.

Я ходил собеседоваться в Сайбер когда-то давно, но тогда мне не хватило опыта на программиста C++. К концу 2012 года там работало уже несколько моих знакомых, одна из них и позвала меня пообщаться снова.

Тестовое задание я писал на C++. Писал код ночью, утром перечитал на свежую голову и отправил письмо с целым ворохом косяков, которые нашёл в коде, а так же способов их устранения. Я тогда переставлял операционную систему на десктопе и решил, что заморачиваться особо не нужно — напишу в блокноте и консоли, оно же простое… В итоге мило побеседовали с начальником по разработке, а HR всё это время тихонько сидела рядом и не встревала. Лишь в самом конце, когда мы уже обо всём договорились, задала мне задачку на логику, чем удивила меня и начальника по разработке. Когда я ходил на второе собеседование, она там уже не работала.

Поскольку это была осень, а проект в Невософте уже находился в стадии полировки, я думал «релиз не за горами» и договорился, что выйду работать лишь с началом следующего года. Год кончился, проект опять завернули на переделку, но занялся в ей уже не я.

Я же вышел в Сайбер и впервые занялся чем-то, совсем не игровым. Моей задачей стало развивать внутренний инструмент, который собирает в Сайбере игры. Это что-то вроде систем continuous integration, но самописное и полностью заточенное под наши требования.

Пришлось учить Python, C#, вместо игрового кода — писать серверные скрипты (да и сам сервер порою дописывать) и графические клиенты к ним. Первые пол-года я вообще ничего полезного не делал, лишь разбирался что там есть и как работает. Со временем конечно начал мелкие баги фиксить или разбирать непонятные ситуации (типа «есть вот это, что с ним сделать, чтобы стало збс?» или «делали то-то, а збс не стало — почему так?»), постепенно дошёл и до новых фич.

Фирма не маленькая, так что больше не приходится самому отвечать за всё — кроме как взять и почитать исходники, тут можно глянуть документацию или посоветоваться с людьми, более компетентными в какой-то конкретной области. Многое даже не приходится делать самому, с другой стороны и мои действия не всегда направлены на улучшение работы подвластных лично мне систем — часто это может быть что-нить для удобства или оптимизации вещи, к которой я никак не отношусь напрямую.

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

С тех пор, как я пришёл в Сайбер, вышло уже четыре игры на нашем движке собранных этой системой, и ещё несколько находятся в разработке.

Прочее (иногда)

Хотя мне и нравится работать в Сайбере, именно игры я тут не делаю — а это немного печально. Так что я начал посматривать что-нить помимо основной работы — мне есть на что покупать себе всякое, так что можно просто делать это в качестве хобби.

Например, в 2013 году я пофиксил пару багов в движке cocos-2dx — они были очень мелкие, но мешали лично мне и мою правку включили в новые версии.

Ещё я пару раз вписывался помочь Lokator Studio. Студия это конечно громко сказано — по-факту это одна разработчица инди-игр, собирающая под свои проекты распределённые команды или сама вписывающаяся помочь кому-нить в проект. Я тестировал одну игру Локатора перед релизом в стиме (тупо попросил бета-билды поиграть, рассказывал о багах да делился мыслями об игре) и, уже как программист, немного причесал для релиза в стиме другую.

История этих инди-проектов наверное заслуживает отдельного поста, а то уже и так «многа букаф» получается.

Один ответ to “Work in GameDev — 10th Anniversary”

  1. azaliyaraisovna said

    Получилась очень интересная и полезная история! Пиши ещё)

Оставьте комментарий