JavaScript vs. C++: создание одной и той же 3D-игры на обоих языках
Я написал один и тот же шутер от первого лица на 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++-версией. Надеюсь, что закончу в ближайшие месяцы. Вот тут можно понаблюдать за прогрессом: сайт игры.
Стоит ли переходить с C# на JS?

Сабж вот в чем, уже 6 день изучаю кодинг. На C# уже там методы какие то пошли. Всё ясно и понятно, но есть одно но! Порог в вхождение, я узнал что изучая СиШарп мне еще долго придется трудиться чтобы стать Джуном, а у меня временные рамки чтобы через 4 мес уже работать джуном где-то.
Хочу узнать стоит ли переходить на Js, html, css, и изучать React и Angular?
Цель у меня: Меньше времение = больше денег.
P.S: Случайно создалось в тех вопросах, хотел на программирование
P.S.S: Сформулировал не правильно вопрос и сабж таким образом что, все подумали что я какой то челик который решил чисто порофлить. Парни я реально хочу узнать потому что не опытен в этой среде, мне хочется побыстрее деньги не потому что я от балды захотел покодить, у меня такое положение что надо побыстрее влиться как джун чтобы развивать свои навыки и решать уже там, более осознанно. Обращаясь к вам я не хотел эти рофельные мемы . И негативные высеры вроде: «Пожу говна дружок! Мы здесь играем в серьезных кодеров, а таких анимешников как ты нам не нужы».

12 Apr 2021 в 00:39 #2
Конечно переходи, тебя здесь все очень ждут

12 Apr 2021 в 00:40 #3
изучай всё, я вот на джаве сейчас с шарпа пересел, но приходится и джаваскрип и хтмл и sql юзать, все связано
12 Apr 2021 в 02:02 #4
Лучше посмотри вакансии в своем городе для джунов, стажировки, и по ним выбирай. Сомневаюсь, что во фронт войти без опыта сильно проще, на хабре в самых популярных вакансиях по откликам сплошной фронтенд. Регулярно встречаю посты о том, как на позицию джуниора приходят сотни откликов в день, вот пример https://habr.com/ru/company/wrike/blog/462787/ . Так что, возможно, придется как-то выделяться скиллами на фоне такой толпы.
12 Apr 2021 в 02:20 #5
Конечно переходи!
Что лучше — всю жизнь формошлёпить в конструкторе IDE на microsoft java, именуемый c#, или довольствоваться мужским языком программирования, который используется во всех сферах, начиная от фронта/бека в вебе, кроссплатформенный для написания десктопных/мобильных приложений/игр (electron, ветвь native (reactnative, vuenative, nativevue, angularnative и так до бесконечности), apache cordova, phonegap, да я устану перечислять), хоть в микроконтроллеры подавайся (iskra js)
Вопрос риторический, для каких целей нужно — для таких и изучай
Любые советчики будут советовать относительно своих интересов и потребностей
Мелкомягких джавистов не слушай, они советуют обычно ересь
12 Apr 2021 в 02:27 #6
ну 4 за месяца джуна на js то можно запоулчить ток компаниям нужен стронг джун + англ преинтермедия хотя бы
12 Apr 2021 в 02:50 #7
уже 6 день изучаю кодинг
Люди после нескольких лет работы переходят на другие языки, а ты спрашиваешь стоит ли переходить после 6 дней?
Конечно не стоит, поизучай пару лет, а потом переходи
12 Apr 2021 в 03:03 #8
Сабж вот в чем, уже 6 день изучаю кодинг. На C# уже там методы какие то пошли. Всё ясно и понятно, но есть одно но! Порог в вхождение, я узнал что изучая СиШарп мне еще долго придется трудиться чтобы стать Джуном, а у меня временные рамки чтобы через 4 мес уже работать джуном где-то.
Хочу узнать стоит ли переходить на Js, html, css, и изучать React и Angular?
Цель у меня: Меньше времение = больше денег.
P.S: Случайно создалось в тех вопросах, хотел на программирование
С такими целями далеко не пойдешь
12 Apr 2021 в 03:09 #9

12 Apr 2021 в 04:03 #10
Сабж вот в чем, уже 6 день изучаю кодинг. На C# уже там методы какие то пошли. Всё ясно и понятно, но есть одно но! Порог в вхождение, я узнал что изучая СиШарп мне еще долго придется трудиться чтобы стать Джуном, а у меня временные рамки чтобы через 4 мес уже работать джуном где-то.
Хочу узнать стоит ли переходить на Js, html, css, и изучать React и Angular?
Цель у меня: Меньше времение = больше денег.
P.S: Случайно создалось в тех вопросах, хотел на программирование
с такими запросами тебе стоит изучить питон.
менять самый универсальный(лучший) язык на ява скрипт?
12 Apr 2021 в 04:23 #11
менять самый универсальный(лучший) язык на ява скрипт?
Но C# не самый универсальный. И даже не топ2. Да и в топ3, скорее всего, не попадает.
12 Apr 2021 в 05:59 #12
Сабж вот в чем, уже 6 день изучаю кодинг. На C# уже там методы какие то пошли. Всё ясно и понятно, но есть одно но! Порог в вхождение, я узнал что изучая СиШарп мне еще долго придется трудиться чтобы стать Джуном, а у меня временные рамки чтобы через 4 мес уже работать джуном где-то.
Хочу узнать стоит ли переходить на Js, html, css, и изучать React и Angular?
Цель у меня: Меньше времение = больше денег.
P.S: Случайно создалось в тех вопросах, хотел на программирование
Если за бабками идешь а не для себя, то ливай. Не надо изучать из-за бабосиков, только себе и другим потом хуже сделаешь

12 Apr 2021 в 07:34 #13
Но C# не самый универсальный. И даже не топ2. Да и в топ3, скорее всего, не попадает.
Это твой субъективный топ?
12 Apr 2021 в 08:10 #14
Это твой субъективный топ?
Это топ основанный на том по каким направлениям у таких универсальных языков есть вакансии, а по каким нет. И C# там особо нечем козырять кроме геймдева, бэкэнда, десктоп разработки и немного мобильной разработки на Xamarin, хотя вакансий по последнему довольно мало. Java, Python и JS могут предложить в этом плане намного большее разнообразие и универсальность.
А то что ты можешь писать под IoT/embedded или сделать свою ОС на C#, это довольно мало кого волнует кроме пары энтузиастов.

12 Apr 2021 в 08:14 #15
Это топ основанный на том по каким направлениям у таких универсальных языков есть вакансии, а по каким нет. И C# там особо нечем козырять кроме геймдева, бэкэнда, десктоп разработки и немного мобильной разработки на Xamarin, хотя вакансий по последнему довольно мало. Java, Python и JS могут предложить в этом плане намного большее разнообразие и универсальность.
А то что ты можешь писать под IoT/embedded или сделать свою ОС на C#, это довольно мало кого волнует кроме пары энтузиастов.
js для челов которые в программировании ноль и они хотят чего-то стоить в виде создания сайтиков.
Python года через 3 никому не усрется ибо каждый мамкин программист изучает python по советам гуру на ютабе.

12 Apr 2021 в 08:15 #16
Это топ основанный на том по каким направлениям у таких универсальных языков есть вакансии, а по каким нет. И C# там особо нечем козырять кроме геймдева, бэкэнда, десктоп разработки и немного мобильной разработки на Xamarin, хотя вакансий по последнему довольно мало. Java, Python и JS могут предложить в этом плане намного большее разнообразие и универсальность.
А то что ты можешь писать под IoT/embedded или сделать свою ОС на C#, это довольно мало кого волнует кроме пары энтузиастов.
12 Apr 2021 в 14:47 #17
js для челов которые в программировании ноль и они хотят чего-то стоить в виде создания сайтиков.
Python года через 3 никому не усрется ибо каждый мамкин программист изучает python по советам гуру на ютабе.
Name язык всегда изучают по роликам на ютубе, но еще живут) Питон будет жить долго и очень долго. Я часто встречаю этих челов которые изучают язык по ютубу, а потом бегают по чатам и спрашивают А ПОЧЕМУ У НАС НИЧЕГО НЕ РАБОТАЕТ.
Для тс
Изучай Python + Django если хочешь ворваться относительно быстро. Попутно с питоном и джангой можешь еще и JS бить сверху(надеюсь ты уже хорошо знаешь хтмл + ксс)
Python Core можно пройти за месяц, остальной месяц тратишь на задачки, после джанго + js core, и так за 2-3 месяца запилишь пару проектов для резюме и все.
13 Apr 2021 в 00:21 #18
js для челов которые в программировании ноль и они хотят чего-то стоить в виде создания сайтиков.
Python года через 3 никому не усрется ибо каждый мамкин программист изучает python по советам гуру на ютабе.
С твоей аватаркой в принципе уже ясно кто ты и что тебе не стоит писать в таких разделах)

13 Apr 2021 в 08:29 #19
Ну ты смотри, перейди на JS, тоже посиди недельку, потом глядишь и мб окажется что на JS сложно и стоит перейти на Python, там в принципе тоже могут появиться трудности и там уже и изучение Golang не за горами, потом, в принципе, еще можешь чекнуть PHP или Ruby(можешь даже попробовать их параллельно поучить за 6-7 дней). Ну а там в принципе еще есть много разных ЯП. Сам найдешь? Не дурак ведь
Ты только посмотри сколько языков можно узнать за каких-то 5-6 неделек, а потом уже и резюме на 2 страницы сможешь оформить и искать сразу на мидла
С твоей аватаркой в принципе уже ясно кто ты и что тебе не стоит писать в таких разделах)
как аватарка влияет на то, чем я занимаюсь ? чел ты иди носик смени и длинные тапочки надень
13 Apr 2021 в 08:36 #20
Сабж вот в чем, уже 6 день изучаю кодинг. На C# уже там методы какие то пошли. Всё ясно и понятно, но есть одно но! Порог в вхождение, я узнал что изучая СиШарп мне еще долго придется трудиться чтобы стать Джуном, а у меня временные рамки чтобы через 4 мес уже работать джуном где-то.
Хочу узнать стоит ли переходить на Js, html, css, и изучать React и Angular?
Цель у меня: Меньше времение = больше денег.
P.S: Случайно создалось в тех вопросах, хотел на программирование
P.S.S: Сформулировал не правильно вопрос и сабж таким образом что, все подумали что я какой то челик который решил чисто порофлить. Парни я реально хочу узнать потому что не опытен в этой среде, мне хочется побыстрее деньги не потому что я от балды захотел покодить, у меня такое положение что надо побыстрее влиться как джун чтобы развивать свои навыки и решать уже там, более осознанно. Обращаясь к вам я не хотел эти рофельные мемы . И негативные высеры вроде: «Пожу говна дружок! Мы здесь играем в серьезных кодеров, а таких анимешников как ты нам не нужы».
это вброс или рофл, все тру прогеры и гики знают что переход возможен только на 1с