JavaScript vs. C++: створення однієї і тієї ж 3D-гри на обох мовах


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

Розповідає автор блогу Irrlicht3d


Я написав один і той же шутер від першої особи на JavaScript, а потім на C++. У цій статті опишу, як усе це відбувалося.

Кілька років тому, коли WebGL почав свій хід по браузерах, у мене виникла ідея – написати шутер від першої особи на JavaScript і HTML. Абсолютно божевільна затія, але вона спрацювала, і навіть не дуже лагала (спробуйте самі). У вільний час я помалу модифікував код, з часом гра обросла різними фічами і стала цікавою.

JavaScript- версія: працює у браузері

 

Тим часом з’явився Electron (якщо коротко, інструмент, що дозволяє з’єднати веб-застосування з браузером і запускати як нативне). І я замислився: “Опа! Може, зробити цей нативний додаток з моєї гри на WebGL? Запхаю його в Electron, і справа в капелюсі”.

Я так і зробив. Вийшло на диво непогано. Але результат працював не дуже: хоч я і доклав багато зусиль, щоб додаток працював саме як додаток, а не веб-сайт, але все одно недоліків була маса – великі затримки, відсутність нормальної апаратної підтримки, 3D, налаштувань повноекранного режиму, погане блокування курсора і ще купа всього.

Тому я вирішив переписати свою гру на C++. І справді – а чому немає-то? Напевно, і не занадто складно буде – JavaScript- код моєї гри грунтувався на 3D-движку CopperLicht (я його сам написав), у якого API майже як у 3D-движка IrrLicht (його теж написав я), на якому і так грунтований мій ігровий движок Framework CopperCube. Роботи ніби не дуже багато – треба тільки переписати ігрову логіку. Усе інше – вікна, інтерфейс, колізії, шрифти, текстури, звук, картинки, обробка файлів і інше – вже було написано, ще і API дуже схоже.

На портування пішли тижні, але в результаті гра стала нативним Win32- застосуванням на C++. Можете скачати її тут.

Нативна версія на C++

Порівняння

Тепер у мене є рідкісна можливість порівняти хід розробки одного і того ж застосування на C++ і JavaScript. Розберу за пунктами.

Продуктивність

Зараз ви дуже здивуєтеся: продуктивність обох реалізацій не сильно розрізняється (Прим.: А ось на комп’ютері без дискретної відеокарти різниця величезна – у браузері гра майже не іграбельна, а ось в C++-версії відсутні навіть щонайменші лаги).

Навіть сама ресурсоємна частина – процедурна генерація будинків і виявлення зіткнень фізичним движком – не сильно лагали на JavaScript. Гальмує буквально разу в два більше, ніж в C++-версії. Оптимізація виконання JavaScript в Chrome мене дуже вразила. До нещастя, все одно JavaScript- версія відчувається більше повільною. Далі я поясню, чому.

Диявол криється в деталях

У реалізації на C++ я міг контролювати будь-яку деталь виконання, будь-яку дрібницю. У JavaScript- версії у багатьох речах я покладався на браузер – в цьому і крилася проблема. На JavaScript процедурна версія ледве помітно підлагувала через те, що деякі виклики WebGL мають властивість ненадовго вішати браузер. Буквально на мілісекунди, але їх дуже багато – тому гра “пливла”, відчувалася дуже повільною по ритму. Я написав декілька обходів для основних проблем, але з іншими нічого зробити, на жаль, було не можна. На C++ же контролювати можна все – і якщо виникають проблеми, можна придумати спосіб їх вирішити.

Версія на JavaScript на моєму комп’ютері видавала той же FPS, що і на C++ – близько 120 кадрів в секунду. Але відчувалася вона дуже, дуже повільною. Залежно від використовуваної ОС і заліза комп’ютера браузер поводиться сильно по-різному, і навіть інтро іноді лагало.

Навіть якщо сцена відмалюється дуже швидко – управління мишкою сильно відставало, для шутера від першої особи таке відставання критичне. Через це гра теж здавалося дуже загальмованою.

У ігровому коді є два способи виконання “ігрового циклу”: requestAnimationFrame () і setInterval (). Одна з версій частково вирішує проблему швидкості введення на одних системах, інша – на інших. Від цього ситуація заплутується ще сильніше.

Таких дрібних проблем було багато, але у усіх була одна причина – в JavaScript- версії все дуже сильно залежить від реалізації браузеру, який часто робить не те, що ви від нього хочете. У C++ такої проблеми не було в принципі.

Швидкість розробки

І JavaScript, і C++ я знаю досить добре, тому швидкість була приблизно однаковою. У C++ іноді виникає потреба реалізувати речі, про які в JavaScript думати не потрібно, та зате система типів C++ допомагає у вилові багів і друкарських помилок. “Хвала” сучасним браузерам – JavaScript відлагоджувати так само зручно, як C++ двадцять років тому.

Особисто я думаю, у обох мов є і плюси, і мінуси. Врешті-решт, обоє вони – просто інструменти для досягнення мети.

Підсумок

Якщо ви вирішите раптом написати свій тривимірний шутер від першої особи, я рекомендую робити це не на JavaScript/HTML/WebGL. Для вбудованих в сайти дрібних іграшок або прототипів вони хороші, але зробити на них повноцінний, та ще і нативний продукт нереально. Ну, принаймні, зараз. Хто знає, раптом через декілька років все стане різко навпаки. Знаю багато людей, які з таким інструментарієм роблять двомірні ігри, і виходить прекрасно. Але для тривимірної гри від першої особи це так не працює.

Я вирішив продовжити роботу над C++-версією. Сподіваюся, що закінчу найближчими місяцями. Ось тут можна постежити за прогресом: сайт гри.

Джерело: блог Irrlicht3d

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Trends: на яких мовах написано шутери

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *