Введение
Разработчик программного обеспечения для видеоигр.
Игровой программист — это инженер-программист, программист или учёный в области компьютерных наук, который в основном разрабатывает кодовые базы для видеоигр или сопутствующего программного обеспечения, такого как инструменты для разработки игр. В игровой разработке существует множество специализированных направлений, все из которых объединены общим термином «игровой программист». Игрового программиста не следует путать с игровым дизайнером, который занимается разработкой игрового дизайна.
История
В первые дни видеоигр (с начала 1970-х до середины 1980-х годов) игровой программист также выполнял функции дизайнера и художника. Это объяснялось тем, что возможности ранних компьютеров были настолько ограничены, что в найме специалистов для каждой роли не было необходимости. Игровые концепции обычно были простыми, а игры рассчитаны на несколько минут игрового времени, но, что более важно, художественное оформление и разнообразие игрового процесса ограничивались скромной вычислительной мощностью компьютеров. Позже, с появлением специализированного аркадного оборудования и домашних игровых систем большей мощности, разработчики игр получили возможность создавать более сложные сюжеты и внедрять такие функции, как графика высокого разрешения и полноцветное изображение, физика, продвинутый искусственный интеллект и цифровой звук. Технологии продвинулись настолько, что современные игры обычно демонстрируют 3D-графику и полномасштабное видео, созданное профессиональными художниками. Сегодня уничижительный термин "программистская графика" ассоциируется с яркими цветами и блочной структурой, характерными для ранних видеоигр. Стремление к большей глубине и объему контента в играх потребовало разделения труда. Сначала производство графики было передано художникам, работающим полный день. Затем игровое программирование отделилось от игрового дизайна. В настоящее время лишь некоторые игры, такие как головоломка Bejeweled, достаточно просты для разработки одним программистом. Однако, несмотря на это разделение, большинство разработчиков игр (художники, программисты и даже продюсеры) вносят свой вклад в окончательный дизайн современных игр.
Дисциплины
Современная видеоигра может включать в себя продвинутую физику, искусственный интеллект, трехмерную графику, оцифрованный звук, оригинальный музыкальный саундтрек, сложную стратегию и может использовать несколько устройств ввода (например, мыши, клавиатуры, геймпады и джойстики) и предоставлять возможность играть против других людей через Интернет или локальную сеть. Разработка каждого аспекта игры может занять все время одного программиста, а зачастую и нескольких. Некоторые программисты специализируются в определенной области игрового программирования, но многие обладают знаниями в нескольких аспектах. Количество программистов, необходимых для реализации каждой функции, зависит от их квалификации, но в большей степени определяется типом разрабатываемой игры.
Программист игрового движка
Программисты игровых движков создают основу игры, включая симуляцию физики и графических систем. Все чаще в видеоиграх используются готовые игровые движки – коммерческие, с открытым исходным кодом или бесплатные. Их часто адаптируют под конкретную игру, и эти программисты занимаются этими изменениями.
Программист физического двигателя
Программист по физике игры отвечает за разработку физической модели, используемой в игре. Как правило, игра моделирует лишь несколько аспектов реальной физики. Например, космической игре может потребоваться симуляция гравитации, но симуляция вязкости воды будет излишней. Поскольку вычислительные ресурсы всегда ограничены, программисты по физике могут использовать "оптимизации", которые требуют небольших вычислительных затрат, но выглядят и ведут себя "достаточно реалистично" для конкретной игры. В других случаях применяется нереалистичная физика для упрощения игрового процесса или создания драматического эффекта. Иногда определяется конкретный набор ситуаций, и результат их физического взаимодействия сохраняется в виде данных и не вычисляется во время работы игры. Некоторые программисты по физике также занимаются сложными задачами, такими как обратная кинематика и другие движения игровых персонажей, однако все чаще эти движения реализуются с помощью библиотек захвата движений, чтобы не перегружать процессор сложными вычислениями.
Программист графических движков
Исторически сложилось, что это звание обычно принадлежало программисту, разрабатывавшему специализированные алгоритмы быстрого копирования и сложные оптимизации для 2D-графики. Однако сегодня оно почти исключительно применяется к программистам, специализирующимся на разработке и модификации сложных 3D-графических движков. Тем не менее, некоторые навыки работы с 2D-графикой вновь стали востребованы в последнее время при разработке игр для нового поколения мобильных телефонов и портативных игровых консолей. Программист 3D-графики должен обладать глубоким пониманием продвинутых математических концепций, таких как векторная и матричная математика, кватернионы и линейная алгебра. Квалифицированные программисты, специализирующиеся в этой области разработки игр, могут рассчитывать на высокую заработную плату и обычно являются редкими специалистами. Их навыки применимы при создании видеоигр для любой платформы.
Программист искусственного интеллекта
Программист ИИ разрабатывает логику поведения, чтобы имитировать интеллект врагов и противников. Это относительно недавно выделилось в специализированную дисциплину, поскольку ранее эти задачи выполнялись программистами других специализаций. Программист ИИ может разрабатывать системы поиска пути, стратегии и тактики противника. Это один из самых сложных аспектов игрового программирования, и его уровень сложности стремительно растет. Современные игры выделяют примерно 10-20% своего штата программистов на разработку ИИ. Некоторые игры, такие как стратегии, например Civilization III, или ролевые игры, такие как The Elder Scrolls IV: Oblivion, активно используют ИИ, в то время как другие, например головоломки, используют его умеренно или вовсе не используют. Многие разработчики игр создали собственные языки сценариев для программирования ИИ в своих играх. Эти языки обычно менее сложны, чем язык, используемый для реализации самой игры, и часто применяются гейм-дизайнерами или дизайнерами уровней для создания игрового мира. Многие студии также предоставляют игрокам доступ к скриптовым языкам своих игр, которые широко используются сторонними моддерами. Технологии ИИ, применяемые в игровом программировании, не следует путать с академическими исследованиями и разработкой ИИ. Хотя обе области взаимно обогащают друг друга, они обычно рассматриваются как отдельные дисциплины, хотя и существуют исключения. Например, в игре Black & White 2001 года от Lionhead Studios реализован уникальный подход к ИИ, управляющему существом, которое обучается и моделирует поведение в процессе игры. В последние годы все больше усилий направляется на интеграцию перспективных направлений исследований в области ИИ и игрового программирования ИИ.
Программист звука
Не всегда являясь отдельной дисциплиной, звуковое программирование было неотъемлемой частью игрового программирования с тех самых пор, как появилась игра Pong. Большинство игр используют аудио, и многие из них имеют полноценный музыкальный саундтрек. Компьютерные аудиоигры полностью отказываются от графики, используя звук как основной механизм обратной связи. Многие игры применяют передовые технологии, такие как позиционирование звука в 3D-пространстве, что делает аудиопрограммирование непростой задачей. В таких играх один или два программиста могут полностью посвятить себя созданию и совершенствованию звукового движка, а звуковые программисты могут быть обучены или иметь формальное образование в области цифровой обработки сигналов. Звуковые программисты часто создают или поддерживают скриптовые инструменты для использования звукорежиссерами. Эти инструменты позволяют дизайнерам связывать звуки с персонажами, действиями, объектами и событиями, а также назначать музыку или атмосферные звуки для игровых сред (уровней или областей) и настраивать параметры окружения, такие как реверберация.
Программист игрового процесса
Хотя все программисты вносят вклад в содержание и впечатления от игры, геймплей-программист уделяет больше внимания стратегии игры, реализации игровой механики и логики, а также "ощущениям" от игры. Это обычно не является отдельной областью специализации, поскольку задачи этого программиста варьируются от игры к игре, и он неизбежно участвует в более узких областях разработки, таких как графика или звук. Этот программист может создавать таблицы стратегий, настраивать ввод данных или корректировать другие факторы, влияющие на игровой процесс. Однако многие из этих аспектов могут быть изменены программистами, специализирующимися в соответствующих областях (например, таблицы стратегий могут быть реализованы программистами, работающими с искусственным интеллектом).
Скриптер
В ранних видеоиграх геймплейные программисты писали код для создания всего контента в игре — если игрок должен был стрелять в конкретного врага, и вместе с текстом на экране должна была появиться красная клавиша, то вся эта функциональность реализовывалась геймплейным программистом как часть основной программы на C или языке ассемблера. Сегодня основной игровой движок обычно отделен от геймплейного программирования. Это дает ряд преимуществ в разработке. Игровой движок отвечает за графику, звук, физику и так далее, а язык скриптов — за кинематографические события, поведение врагов и игровые цели. В крупных игровых проектах может работать команда скриптеров, реализующих подобный игровой контент. Скриптеры, как правило, также являются гейм-дизайнерами. Часто проще найти квалифицированного гейм-дизайнера, которого можно обучить языку скриптов, чем найти гейм-дизайнера, владеющего C++.
Программист пользовательского интерфейса
Этот программист специализируется на программировании пользовательских интерфейсов (UI) для игр. Хотя некоторые игры имеют собственные пользовательские интерфейсы, этот программист с большей вероятностью разработает библиотеку, которую можно будет использовать в нескольких проектах. Большинство UI выглядят как двухмерные, однако современные UI обычно используют ту же 3D-технологию, что и остальная игра, поэтому для этой роли полезно знание 3D-математики и систем. В продвинутых системах UI может быть предусмотрена поддержка скриптов и специальных эффектов, таких как прозрачность, анимация или эффекты частиц для элементов управления.
Входный программист
Программирование ввода, хотя обычно и не является должностью или даже штатной позицией в конкретном игровом проекте, всё же является важной задачей. Этот программист пишет код, определяющий, как устройства ввода, такие как клавиатура, мышь или джойстик, воздействуют на игру. Эти подпрограммы обычно разрабатываются на ранних этапах производства и постоянно дорабатываются в процессе разработки. Как правило, программисту не требуется посвящать всё своё время разработке этих систем. Игра с управлением движением в реальном времени, использующая такие устройства, как Wii Remote или Kinect, может потребовать очень сложной и малозадержной системы ввода, в то время как требования к устройствам HID в пошаговой стратегии, управляемой мышью, такой как Heroes of Might and Magic, значительно проще в реализации.
Сетевой программист
Этот программист пишет код, позволяющий игрокам соревноваться или сотрудничать, подключенным через локальную сеть или Интернет (или, в редких случаях, напрямую через модем). Программисты, занимающиеся реализацией этих игровых функций, могут посвятить все свое время именно этой роли, которая часто считается одной из самых технически сложных. Сетевая задержка, сжатие пакетов данных и потеря или разрыв соединения – это лишь некоторые из проблем, которые необходимо учитывать. Несмотря на то, что разработка многопользовательских функций может занять весь производственный цикл и требует проектирования других систем движка с учетом сетевого взаимодействия, сетевые системы часто откладывают на последние несколько месяцев разработки, что усложняет работу программиста. В некоторых играх онлайн-функции (часто рассматриваемые как менее приоритетные, чем основной геймплей) были вырезаны за несколько месяцев до релиза из-за проблем, связанных с недостаточным управлением, отсутствием предварительного проектирования или масштабируемости. Virtua Fighter 5 для PS3 – яркий пример этой тенденции.
Программист игровых инструментов
Программист инструментов может помочь в разработке игры, создавая для неё специализированные инструменты. Инструменты разработки игр часто включают в себя такие функции, как компиляция скриптов, импорт или преобразование графических ресурсов и редактирование уровней. Хотя некоторые используемые инструменты могут быть готовыми продуктами, такими как IDE или графический редактор, программисты инструментов создают инструменты с конкретными функциями, настроенными под конкретную игру, которых нет в коммерческих продуктах. Например, разработчику приключенческой игры может потребоваться редактор для создания разветвлённых диалогов, а разработчику спортивной игры – собственный редактор для управления игроками и командной статистикой. Эти инструменты обычно недоступны конечным пользователям, покупающим игру.
Портирование программиста
Портирование игры с одной платформы на другую всегда было важной задачей для разработчиков игр. Некоторые программисты специализируются именно на этом, адаптируя код из одной операционной системы для работы в другой. Иногда программист отвечает за то, чтобы приложение работало не только на одной операционной системе, но и на различных устройствах, например, на мобильных телефонах. Однако часто "порт" может потребовать полной переработки игры с нуля, поскольку использование проприетарных языков, инструментов или аппаратного обеспечения делает преобразование исходного кода бессмысленным. Такой программист должен хорошо знать как исходную, так и целевую операционные системы и языки программирования (например, переводить игру, изначально написанную на C++, на Java), адаптировать ресурсы, такие как графика и звуки, или переписывать код для телефонов с ограниченной памятью. Ему также может потребоваться обходить ошибки в реализации языков, некоторые из которых плохо документированы, рефакторить код, контролировать различные ветви разработки, переписывать код для масштабирования под широкий диапазон размеров экранов и соблюдать особые требования операторов. Кроме того, ему, возможно, придется исправлять ошибки, которые не были обнаружены в оригинальной версии игры.
Технологический программист
Технологический программист чаще встречается в крупных студиях разработки, имеющих отдельные отделы, полностью посвященные НИОКР. В отличие от других членов команды программистов, технологический программист обычно не привязан к конкретному проекту или типу разработки на длительный срок и, как правило, подчиняется непосредственно техническому директору (CTO) или главе отдела, а не продюсеру игры. Как следует из названия должности, эта работа предъявляет очень высокие технические требования и требует глубокого понимания аппаратной части целевой платформы. Задачи охватывают широкий спектр вопросов, включая практическую реализацию алгоритмов, описанных в научных публикациях, оптимизацию кода на уровне ассемблера и умение решать сложные проблемы, связанные с требованиями к памяти и кэшированию на поздних стадиях проекта. Эта должность во многом пересекается с другими, особенно с должностью графического программиста.
Генералист
В небольших командах одного или нескольких программистов часто называют "универсалами", которые берут на себя различные роли по мере необходимости. Универсалы часто занимаются поиском и отладкой ошибок, а также определением необходимой экспертизы в конкретных подсистемах для их устранения.
Ведущий игровая программист
Главный программист несет окончательную ответственность за всё программирование в игре. В его обязанности входит обеспечение корректной реализации различных подмодулей игры и контроль за ходом разработки с точки зрения программирования. Обычно на эту должность переходят после нескольких лет опыта работы в других областях игрового программирования. Несмотря на название, у главного программиста, как правило, меньше времени на написание кода, чем у других программистов в проекте, поскольку ему необходимо посещать совещания и взаимодействовать с заказчиком или другими ведущими специалистами. Тем не менее, от главного программиста по-прежнему ожидается, что он будет писать код хотя бы время от времени, а также обладать знаниями в большинстве технических аспектов игры. Часто роли технического директора и главного программиста имеют значительное пересечение, и нередко эти обязанности выполняет один и тот же человек.
Платформы
Программисты игр могут специализироваться на той или иной платформе, например, Wii U или Windows. Таким образом, помимо специализации в определенной области разработки игр, программист может также специализироваться на разработке для конкретной платформы. Соответственно, должность игрового программиста может звучать как "Программист 3D-графики для PlayStation 3". Некоторые области, такие как искусственный интеллект, применимы к различным платформам и не требуют адаптации под конкретную систему. Кроме того, общие принципы разработки игр, такие как концепции программирования 3D-графики, звукорежиссура и дизайн пользовательского интерфейса, могут быть использованы на разных платформах.
Образование
Примечательно, что многие игровые программисты не имеют специального образования, начав как энтузиасты и самостоятельно много программируя для удовольствия, и в конечном итоге добившись успеха благодаря своим способностям и опыту, полученному самостоятельно. Однако в большинстве объявлений о вакансиях для игровых программистов требуется степень бакалавра (в математике, физике, информатике или эквивалентный опыт). Все больше университетов начинают предлагать курсы и программы по игровому программированию, которые во многом пересекаются с программами по компьютерным наукам и разработке программного обеспечения.
Заработная плата
Зарплата программистов игр варьируется в зависимости от компании и страны. Однако в целом оплата труда в игровой разработке примерно соответствует оплате сопоставимых должностей в бизнес-секторе. Это при том, что программирование игр – одна из самых сложных областей, и обычно требует более длительного рабочего дня, чем стандартное программирование. Результаты опроса, проведенного в 2010 году в США, показывают, что средняя годовая зарплата программиста игр составляет 95 300 долларов США. Программисты с опытом работы менее 3 лет зарабатывают в среднем более 72 000 долларов в год. Программисты с опытом более 6 лет зарабатывают в среднем более 124 000 долларов в год. Как правило, наиболее высокооплачиваемыми являются ведущие программисты, хотя некоторые специалисты по 3D-графике могут получать зарплату на их уровне или даже выше. Согласно тому же опросу, ведущие программисты в среднем зарабатывают 127 900 долларов в год.
Безопасность работы
Хотя продажи видеоигр сопоставимы с продажами других видов развлечений, таких как кино, индустрия видеоигр крайне волатильна. Программисты игр не защищены от этой нестабильности, поскольку их работодатели сталкиваются с финансовыми трудностями. Разработчики сторонних проектов, наиболее распространенный тип разработчиков видеоигр, зависят от стабильного притока средств от издателя. Если не соблюдены сроки или не достигнуты промежуточные результаты (или по множеству других причин, например, если игра отменена), финансирование может иссякнуть, и разработчику может быть вынужден сократить штат или объявить о банкротстве и закрыться. Программисты, работающие в крупных издательствах, в некоторой степени защищены от подобных ситуаций, но даже крупные издатели могут обанкротиться (как, например, когда Hasbro Interactive была продана Infogrames и несколько проектов были отменены, или когда The 3DO Company обанкротилась в 2003 году и прекратила деятельность). В резюме некоторых программистов игр содержатся лишь краткие периоды работы, не превышающие года, поскольку им приходится переходить из одной проблемной студии в другую. Именно поэтому некоторые предпочитают заниматься консалтингом, что в определенной степени ограждает их от последствий неудач отдельных студий.
Языки и инструменты
Большинство коммерческих компьютерных и видеоигр написаны преимущественно на C++, C и некоторых языках ассемблера. Многие игры, особенно с комплексной интерактивной игровой механикой, нагружают аппаратное обеспечение до предела. Следовательно, для обеспечения приемлемой частоты кадров требуется высокооптимизированный код. По этой причине компилируемый код обычно используется для критически важных компонентов, таких как визуализация и расчет физики. Практически все компьютерные игры также используют API DirectX, OpenGL или какую-либо оберточную библиотеку для взаимодействия с аппаратными устройствами. Различные скриптовые языки, такие как Ruby, Lua и Python, также применяются для создания контента, например, игрового процесса и, в особенности, искусственного интеллекта. Скрипты обычно разбираются при загрузке (когда игра или уровень загружаются в оперативную память), а затем выполняются во время работы программы (через логические ветвления или другие подобные механизмы). Как правило, они не выполняются интерпретатором, что привело бы к значительно более медленной работе. Скрипты обычно используются выборочно, часто для ИИ и высокоуровневой игровой логики. Некоторые игры разрабатываются с высокой зависимостью от скриптов, а отдельные скрипты компилируются в бинарный формат перед запуском игры. На этапе оптимизации разработки некоторые функции скриптов часто переписываются на компилируемом языке. Java используется во многих веб-играх, поскольку она кроссплатформенна, обычно не требует установки пользователем и представляет меньшие риски для безопасности по сравнению с загружаемой исполняемой программой. Java также является популярным языком для мобильных игр. Adobe Flash, использующий язык ActionScript, и JavaScript – популярные инструменты разработки для браузерных игр. По мере увеличения размера и сложности игр, промежуточное программное обеспечение (middleware) становится все более востребованным в индустрии. Middleware предоставляет более широкие и высокоуровневые функциональные возможности и более богатый набор функций, чем стандартные API нижнего уровня, такие как DirectX и OpenGL, например, скелетную анимацию. Помимо предоставления более сложных технологий, некоторые middleware также стремятся к платформенной независимости, что значительно упрощает распространенные преобразования, например, из Microsoft Windows на PS4. По сути, middleware направлено на максимальное сокращение избыточности в цикле разработки (например, написание новых систем анимации для каждой игры, которую производит студия), позволяя программистам сосредоточиться на новом контенте. Другие инструменты также необходимы разработчикам игр: 2D и 3D пакеты (например, Blender, GIMP, Photoshop, Maya или 3D Studio Max) позволяют программистам просматривать и изменять ресурсы, созданные художниками или другим производственным персоналом. Системы контроля версий обеспечивают сохранность исходного кода и оптимизируют слияние изменений. Интегрированные среды разработки (IDE) с отладчиками (такие как Visual Studio) делают написание кода и поиск ошибок менее трудоемким процессом.