Ръководство за програмиране на игри - съвети, инструменти и кариери

от Connor Taylor

Програмистът на игри е човекът, който взима визията на дизайнера и я прави работеща в използвания от нас гейм енджин. Работя в екипа за програмиране на мобилни игри в Kwalee, така че основно използваме Unity. Например, ако дизайнерът иска зарове да се търкалят по специфичен начин, пиша скрипта, който да управлява логиката. Също така, си сътрудничим с художници на игри, за да сме сигурни, че игрите ни изглеждат невероятно и постигат добро представяне на устройствата.

В този блог ще черпя опит от петте си години работа в Kwalee, за да споделя основни прозрения и съвети за това да бъдеш програмист на игри. Ще ви запозная с някои от езиците, инструментите и принципите, които използваме, с моите кариерни съвети, както и с начални и напреднали съвети.

Какво прави един програмист на игри?

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

Грижим се играта да чувства добре и да работи с висока производителност. За да направим това, трябва да гарантираме, че самият код е чист и разширяем, което е по-трудно, отколкото си мислите. Използваме стандарти за кодиране, за да поддържаме последователно качество в нашия екип - документ, който може да съдържа стандарти за именуване, форматиране и т.н. Обаче, понякога нещата не са винаги толкова прости и от време на време може да се наложи да мислите извън кутията, за да свършите работата навреме.

Нашите отговорности също включват осигуряване на добра работа на играта на хардуера на крайния потребител. Например, в нашите мобилни игри трябва да избягваме по-старите устройства да стават твърде горещи, затова работим с художниците за оптимизиране на броя на draw calls. Draw call е команда, изпратена от Централния процесор (CPU) към Графичния процесор (GPU), за да нарисува обект на екрана - казва на GPU да изчертава графични елементи като текстури, мрежи или шейдъри. Трябва да минимизираме броя на тези draw calls в нашата игра, защото наличието на твърде много може да причини проблеми като спад на кадрите или закъснения. Има много начини за решаване на този проблем, но неща като групиране на множество обекти в един draw call или намаляване на броя на уникалните текстури и материали могат да помогнат. Това е особено важно за мобилни устройства, тъй като има толкова много различни устройства на пазара с различни технически спецификации.

Кои са основните езици за програмиране на игри?

По-голямата част от времето като ежедневни програмисти на игри прекарваме в програмиране на един от редица програмни езици - ние всъщност сме различен вид софтуерни разработчици. Има много езици за избор. Някои изглеждат по-лесни от други, но веднъж като сте научили и усвоили един, определено можете да научите и други - основното предизвикателство е да си влезеш в вратата.

Ето въведение в някои от най-популярните езици за програмиране на игри:

  • C# - универсален и популярен програмируем език, широко използван в разработването на игри. Той е един от най-лесните за научаване, ако сте начинаещи. Една от най-добрите му характеристики е автоматичното управление на отпадните данни - така то управлява алокацията на памет за вас - много полезно за заетите програмисти като нас.
  • C++ - за разлика от това, това е неконтролиран език, така че трябва ръчно да разпределяте и освободите памет, което го прави по-голямо предизвикателство по сложност и трудност. Въпреки това, осигурява по-голяма скорост, контрол и производителност.
  • Java - подобно на C#, Java има собствено управление на паметта и събиране на отпадни данни, правейки по-лесно за разработчиците да управляват паметта, без да се задълбават в детайлите. Широко се използва в уеб-разработването и корпоративните приложения, и макар да не е (спорно) най-добрият избор за разработка на игри, остава солиден вариант за създаване на мащабируеми и ефективни приложения.
  • Swift - това е родният език на Apple за изграждане на приложения и игри за iOS и macOS. Въпреки това, това го прави по-малко полезен за разработка на различни платформи - тъй като се стремим винаги да публикуваме нашите мобилни игри и на Android, и на iOS.

Как да стана програмист на игри?

Има много различни пътища, по които можете да станете програмист на игри. Моето направление е доста конвенционално - изучавах гейм дизайн и програмиране в Университета Стафордшир. Първоначално мислех, че ще се ангажирам с изкуството за игри - винаги съм бил много страстен за изкуство като дете, освен това наистина се насладих на арт модулите в университета, но докато бях там открих, че наистина много ми харесва създаването на геймплей. Може да ми отнеме няколко дни, за да създам един сложен модел, но мога да накарам патица да лети и експлодира за половината от това време. Прототипирането ми позволява да видя резултата бързо пред себе си.

Обаче, красотата на програмирането на игри е, че е достъпно за повечето хора дори ако не преминават през традиционен път. Имах приятели в университета на възраст 50+ - никога не е късно да се преживее нещо ново. В Kwalee дори наехме някой, който научи основно чрез видеа в YouTube и направи игра за забавление. Има толкова много възможности днес за свежи и жадни за учене таланти. Гледайки портфолиата на нови студенти, те имат толкова много постижения. Виждаме фантастичен талант и се вълнуваме за това в индустрията.

Въпросът, който вероятно горите от желание да попитате - ще повлияе AI на програмирането като кариера? Може да бъде изключително полезен и става все по-добър. Перфектен, ако ви трябва нещо обяснено или сте се задържали на проблем. Можете да го използвате за отстраняване на грешки, или за рефакторирането (почистването) си на код, като го поставите в най-новата версия на ChatGPT. Обаче когато разглеждаме портфолиа, искаме да видим работата, която сте извършили и с която сте горди, AI е добре да използвате, но опитайте да не го използвате като заместител на собствените си умения.

Какъв е типичният ден в живота на програмист на игри?

Позволете ми да дам пример въз основа на моя живот. Аз съм водещ програмист (наричам това моята мечта), затова е страхотна смес от практическа работа и управление на други програмисти!

Типичен ден в моя свят е да вляза, да си направя лате, след това да проверя за грешки или блокери за QA екипа. Проверявам с екипа дали някой от тях има нужда от нещо от мен, за да отпушат работата си. Тогава пускам музиката и списъкът със задачи излиза. Споделяме видеа на напредъка чрез Slack, за да получим бърза обратна връзка, докато се движим между 2-3 проекта за подпомагане на членовете на моя екип. Също така прекарваме много време в инвестиции в споделени системи, за да направим нашето програмиране по-ефективно - всичко трябва да се поддържа, обновява и поправя редовно, за да тече гладко.

Съвети за начинаещи програмисти на игри

Ако започвате и искате да станете завършен програмист, ето моите съвети за начинаещи!

  • Има толкова много за учене онлайн, на YouTube и има толкова много примерни игри, че нямате извинение да не се учите! Популярните енджини са безплатни и са много забавни за използване!
  • На другия край на спектъра, може да е на 30 години, но трябва да се опитате да прочетете влиятелната книга „Design Patterns: Elements of Reusable Object-Oriented Software“ от така наречените автори на Gang of Four, които въведоха някои от основите на игровите патерни, които използваме всеки ден в програмирането.
  • Може да имате собствени идеи, но се уверете, че започвате просто, за да бъдете в основите.
  • Когато не сте свързани с търговски проект, можете да пишете колкото код искате, така че се забавлявайте създавайки безумни неща.
  • Изграждането на портфолио е наистина ключово (и така получих работата си). Но бъдете много внимателни да не качвате същите стари проекти от университета, защото ще видим много приложения с тях. Дори допълнителен ден за рескинване и добавяне на повече функции ще ви помогне да се отличите.
  • Създаването на собствена реална игра също е умна идея - много евтино е да пуснете игра в Google Play, така че пуснете нещо, което можете да покажете на рекрутъри/издатели/семейство/домашни любимци на телефона си. Може дори да изкарате няколко хиляди долара на година, докато не се устроите с ексклузивна постоянна работа, това е бонус! Или може да ви изкуши да направите собствена пълна игра и да партнирате с издател.
  • Не научавайте само програмиране - научете за изкуство, дизайн, QA и други дисциплини, с които ще взаимодействате. Например, струва си да разберете QA методи, защото можете да паднете в капана, че нещо работи, но трябва да го изиграете като потребител, а не като някой, който е написал кода и има дефинирана визия как очаквате да 'се играе'. Бъдете разрушителни, опитайте случайни неща, които хората може да направят - натискайки случайни бутони и друго странно поведение.

Съвети за напреднали програмисти

Ето някои от съветите, които ми помогнаха да премина от младши, до програмист, до старши и до водещ.

  • Винаги можете да се възползвате от повече учене и помнете, че без грешки не можем да учим!
  • Ако наистина сте страстни за нещо, може да станете повече специализирани. Например, ако обичате да играете с шейдъри и рендериращи канали, научете повече как да използвате графични шейдъри, за да разширите способността си да рендерирате сложни визуални ефекти и да използвате рендериращи канали, за да оптимизирате производителността или да направите страхотни ефекти.
  • Може да направите нещо наистина готино, като сложна система, да я качите в магазин за активи, за да я покажете, ако договорът ви позволява, и да покажете напредналата си работа. Можете да развиете ниша като определен тип програмист, като програмист за геймплей, сървърен програмист, графичен програмист или програмист за мултиплейър.
  • Или можете да поемете мениджърския път като мен, и да наставлявате хора. Тактиката ми за развитие на кариерата ми беше да поемам нови отговорности. Първо започнах да подобрявам по-малки неща, т.е. малки промени в работните процеси. След това улесних процесите, използвайки шаблони, за да спестим време при създаване на нови проекти. После започнах да се наслаждавам на наставническа работа и мениджмънт, което ми даде повече увереност и сега участвам в рецензии от колеги, преглед на код, водене на работилници и водене на екипи по проекти.

Независимо дали работите като част от екип или като мениджър, също толкова важно е да давате похвали, колкото и да давате конструктивна критика. Когато преглеждате кода, добре е да се възхищавате на хората!

Кои са ключовите принципи на програмирането на игри?

Има някои ключови теми, които просто трябва да влязат в блог за програмиране на игри. Тези са някои от най-важните неща, които обмисляме.

Контрол на източника/версионен контрол

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

Тези термини понякога се припокриват, но общо казано, контролът на източника се фокусира върху кода, а версионният контрол включва всички файлове на проекта, ресурси и документация.

Като започнете да използвате контрол на източника, може да изглежда малко страшно в началото, може да изглежда много обременително и когато става въпрос за конфликти, може да се окажете неуверени какво да правите. Но натурата на версионния контрол ви помага да съхранявате моменти във времето, така че ако често актуализирате и използвате подробни коментари при потвърждения, е невероятно полезно и безопасно. Можете да се върнете на множество точки, да имате множество клонове и т.н. Мислете за това като за спасителна мрежа за разработчиците, за да избегнем версия на Toy Story 2 на Pixar - случайно изтрита и след това възстановена от твърд диск в дома на техния технически директор, вместо това всичко е безопасно на сървъра.

Обектно ориентирано програмиране

Това е типът програмиране, който използваме основно в Kwalee. Използва обекти, за да представи реални неща или абстрактни концепции и цели да организира кодбазата, използвайки принципи, които отразяват как виждаме и взаимодействаме с обектите в реалния свят. Помага за поддържане на сложни системи, като организира кода в отделни класове, които можете да използвате отново, мащабирате и поддържате по-лесно.

Разбира се, има дебат дали е добро или не. Докато не е с най-добро представяне, работи добре. Също като езиците, всеки има свои плюсове и минуси и трябва да научите един, за да започнете и да се ориентирате как работят езиците и компилаторите (преводачи на човешки код в машинен код). Можете също така да обмислите други типове, като функционално програмиране, което го третира повече като математика, логическо програмиране, което използва факти и правила или процедурно програмиране, което използва стъпка по стъпка данни.

Програмни патерни

Това са много полезни неща - решения за повторно използване, които могат да помогнат с често срещаните проблеми, с които ще се срещнете в дизайна на софтуер. Те ви дават шаблон за разрешаване на проблем, за да не се налага да изобретявате отново колелото всеки път и можете да следвате доказани решения.

Например, Singleton дизайнът на патерн ви помага да осигурите, че има само един екземпляр на клас, като мениджър на настройки на играта, във вашата игра и ви дава глобална точка за достъп до него. Кодът за този патерн означава, че съществува само един екземпляр на класа SettingsManager, така че не е необходимо да го създавате или дублирате всеки път когато ви трябва.

Съществува също Factory патернът, който може да ви помогне да създавате обекти по по-организиран и гъвкав начин. Можете да дефинирате методи за генериране на специфични типове обекти, като герои или артикули, въз основа на входни параметри, позволяващи лесно създаване на повече обекти от подобен тип, без да започвате от нулата всеки път.

Надявам се, че този блог ви е дал възможност да вкусите от програмирането на игри, независимо дали сте нови в полето или опитен програмист! Ако сте работещ, но забавен човек, ще подхождате на нашия екип, така че разберете повече за кариера в Kwalee. В противен случай можете да научите за нашите мобилни игри или издаване и да разберете повече за това какво пускаме като разработчик и издател.

За автора:

Connor Taylor, водещ програмист на игри в Kwalee, процъфтява в създаването на игри и в подкрепата на забавен и сплотен екип. С над 5 години опит, той е създал успешни игри като Jetpack Jump и ръководи други в развитието с Unity.

Сподели тази статия: