Обновить
37
Виталий Новичков@Wohlstand

Инженер-Программист С++

3
Подписчики
Отправить сообщение

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

Я сам был вебером, пока учился в универе, однако, мне веб сильно надоел тем, что было (на тот момент) полно неудобных инструментов разработки (это сейчас мы имеем JetBrains, VisualStudio Code, Atom, и кучу всевозможных фрэймворков и под JavaScript, и под PHP, т.п.), а также, по вебу у меня не было масштабных серьёзных проектов. Мой первый настоящий масштабный проект был начат именно на C++.

Почему я для себя выбрал C++?

Мне этот язык полюбился за его широкие возможности, и особенно за то, что он среди тех, которые умеют создавать монолитные, лёгкие и независимые исполняемые файлы (системные библиотеки не считаются). Я пробовал и смотрел много разных решений, но ни одно из них мне не понравилось, поскольку либо результат получался громоздским и тяжеловесным, либо зависел от кучи ещё более тяжеловесных бибилотек и сред исполнения, и т.п. И как раз мне подвернулось в универе изучить C++. Сначала я его не особо использовал, кроме как для решения лаборатоных работ и курсовых. Однако, к 2014 году у меня созрела идея создать проект, который вроде бы как хобби, но благодаря нему, я начал профессиональную карьеру программиста C++, и мне это сыграло на руку.

Через Emscripten легко собирается для работы в браузере через WebAssembly. Недостаток работы из браузера, это невозможность легко добавлять в игру свои ресурсы или эпизоды без полной пересборки игры с созданием пака ресурсов. Создать возможность "выгрузки" даёт лишь временный эффект, "выгруженные" данные будут летать в воздуже, а если их объём гигабайт? (Есть такие эпизоды тяжёлые). Веб-версия хороша в качестве демки, при этом, игра полноценная и её можно пройти целиком.

Очень интересное объяснение, действительно, я абсолютно не правильно сказал на счёт "интерпретируется". Благодарю за подробности! Такой комментарий вообще заслуживает быть полноценной статьёй. А так, я и подозревал, что код при исполнеии уже хранится в преобразованной форме концептуально больше похожий на Java или .NET, а вовсе не на bash и т.п., с которыми его сравнивали.

В Вики-разделе репозитория есть ссылки на сборки под разные платформы, в т.ч. и под винду (x86_64, ARM64 и x86).

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

У китайцев есть несколько подобных игр, и они даже вместо GDI запилили использование DirectX 9 там. Среди игр прошлого полно VB-игр от самих Microsoft (пакет Best Of Windows Entertainment Pack), там по большей части логические и карточные игры, если не считать Chip's Challenge, представляющую из себя бродилку с головоломками. При этом, они были созданы с более старыми версиями VB, по моей памяти, это где-то версия 3 (работало прямо на борту Windows 3.1).

VB как идея песочницы для неопытных пользователей, которые могут создавать там простые программы, решая различные задачи, вполне годная, и да, отладчик действительно позволял ограниченно химичить с кодом прямо налету, всё потому что код интерпретировался.

частенько ронялась вся IDE

В моём случае IDE роняется тогда, когда я инициализирую внешнюю C-библиотеку (я сделал обёртку вокруг SDL2 и MixerX, которую я запилил для замены звукового ядра в оригинальной игре), и когда я прерву программу на середине работы, тут IDE и разобьётся вдребезги, потому что аудиопоток, созданный на стороне SDL2, не был корректно погашен. Даже не было специальной ловушки, чтобы корректно гасить подобные библиотеки прямо во время работы IDE, и это больно... Тут есть место архитектурным ошибкам: исполняемую среду надо строго выносить наружу, и взаимодействовать с обработчиком по межпроцессу, и тогда если что-то сдохнет на стороне, это не побьёт IDE. Также я сталкивался с тем, что если на стороне C-библиотеки (которую я создал для того, чтобы пришпилить к VB6-проекту некоторые библиотеки и кусочки кода на C или C++), допущена ошибка по типу вылез за пределы памяти, или не правильно оформил соглашение вызова публичной функции, IDE начнёт баговать глючить, если переживает подкапотный кавардак. В итоге, отлаживать игру приходится строго в режиме с отключённым звуком совсем, потому что иначе если прервать игру во время работы звука, сдохнет вся среда.

Благодарю за комплимент!

На самом деле, никогда не поздно геройствовать, и уже есть не мало случаев, когда люди и за 50, и за 70 и старше, делали великие дела, и Вы сможете, если этого очень сильно захотите и решительно пойдёте на реализацию задумки и на поиски ответов на любые вопросы. Всё в ваших руках! Главное, не тонуть в рутине, и сохранять себя!

Нет, не пробовал. Теоретически, с этим можно отдельно поэкспериментировать. Моя основая цель была именно полностью портировать игру на C++ в качестве наиболее универсального языка, поддерживаемого большинством различных платформ.

Если интересно что-то в общем, то @SnakeSolid уже ответил на вопрос.

В оригинальном SMBX, Эндрю почти не делал оптимизацию вообще, за исключением блоков, где он применил линейную тайловую сортировку:

  • Фоновые объекты, НИП, проходы и двери, зоны воды / зыбучего песка, работают вообще без оптимизации: все массивы проходят целиком каждый раз. На карте мира абсолютно также.

  • Блоки используют одномерную тайловую оптимизацию (работает по горизонтали):

    • Создаётся два массива диапазоном -8000 и +8000

    • Весь массив блоков предварительно сортируется по Y, группируясь по X

    • Первый массив хранит индексы начала группы на каждый столбец шириной в 32 пикселя и высотой в бесконечность

    • Второй массив хранит индексы конца группы на каждый столбец

    • Первичный поиск идёт следующим образом: из первого массива запрашивается значение с интексом (x / 32) - 1, а из второго массива запрашивается значение с индексом ((x + w) / 32) + 1. Мы получаем границы поиска - индекс первого блока группы fBlock, и индекс последнего блока группы lBlock.

    • Дальше, проходимся по массиву блоков от fBlock по lBlock, и попарно проверяем коллизию с блоками.

    • Данный метод эффективен в невысоких горизонтальных секциях, и очень неэффективен в верикальных.

    • Данный метод не позволяет безопасно и свободно перемещать блоки по секции без пересортировки всего массива: по вертикали в рамках группы перемещать их можно, однако, если двигать по горизонтали, потребуется пересортировка массива, поскольку блоки переходят из одной группы X в другую. Эндрю у себя в коде совсем отключает эту оптимизацию, если с помощью движущихся слоёв перемещать блоки по-горизонтали. Из-за этого возникает проблема, названная "проблемой доктора Пеппера" (в честь имени уровня, где эта ошибка чётко воспроизводится).

В моём порту по большей части пока что используется всё то, что сделал Эндрю, за исключением карты мира: я реализовал использование квадратного дерева (реализацию LooseQuadTree), чтобы ускорить поиск видимых элементов. В планах применить квадратное дерево и на уровнях по остальным местам. На ветке devel, мой друг-соразработчик проделал работу по замене линейной тайловой сортировки на квадратное дерево, тем самым полностью исправив "проблему Доктора Пеппера".

Тайловый поиск хоть и просто реализуется, но он не очень эффективен, если много движущихся объектов, приходится их часто перерегистрировать между ячейками. А также, размерностью массива прямо задаётся максимальный предел размера игрового поля. Я предпочитаю квадратное дерево, поскольку оно позволяет свободно перемещаться объектам, нахоящимся в нём, а также не ограничивает максимальный размер игрового поля. Я раньше использовал R-дерево в другом моём проекте, однако, у него есть недостаток: элемент нельзя свободно перемещать, его можно лишь удалить и добавить заново (с новыми координатами). Из-за этого проседала производительность. Квадратное дерево работает эффективней.

Мой портированный проект да, на C++. @ewgeniy2004 имеет в виду код оригинальной игры как есть (который на VB6).

Порт игры требует компилятор, поддерживающий стандарт C++11. То есть, для семейства MSVC это 2015 (версия 2013 имеет прблемы с constexpr). Для семейства MinGW где-то ориентировчно 4.8 минимум, но в основном используются наборы версии 5 и старше.

полноценный RangeArr можно получить "бесплатно", унаследовав от std::array

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

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

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

Из-за этой самрекламы Никиты мы с друзьями немедленно убрали и Шильди, и Войси, повесив вместо них "тигрёнка" (The Captcha Kitty), коотрый успешно выполняет свою роль. Были мысли развернуть Шильди на собственном сервере, но руки пока не дошли до этого.

Также забыл добавить, что если ориентировать на "англоязычную" аудиторию, и затем среди иностранцев кажется, что мало быдла, из-за того, что для многих английский это не родной язык, они его отдельно изучали, чтобы на нём излагаться. Быдло по большей части это эссенция необразованности, и следовательно, иностранные языки они не учат совсем. Можно найти огромное число быдла если ориентироваться на чисто США, тут и повалится весь местный гангста-слэнг, и матюки, и токсичность. Даже я где-то читал, почему американские компании-производители предпочитали строить заводы в Китае - объяснили тем, что в США рабочие заметно менее образованные, чем китайцы.

Русскоязычная аудитория не любит платить, но очень любит ненавидеть

Всё очень сильно зависит от площадки, на которой размещать новости и посты, а также зависит от того, на кого ориентировать статью, на образованных специалистов, или на бестолковое быдло, которого полно и за пределами России (по иностранным форумам и Discord-серверам встречал немало быдла именно среди иностранцев: и американцы, и канадцы, и немцы, и много кто ещё). Мне однажды в личку один неадекват из США пристал и начал ругаться на меня что я такой сякой, не объяснив ничего. И да, такое токсичное быдло надо безжалостно банить, а также явно в своих правилах требовать высказывать критику конструктивно. Если кто-то начинает токсично ругаться на мои проекты, без объяснения причин. Я тут же спрашиваю, "А почему мой проект отстой? Ну-ка расскажи подробно". Либо в ответ тишина, либо крайне редко человек всё-таки адекватно описывается мне о проблемах, с которыми тот столкнулся, и тут я и разжёвываю, что и как. К моим Android-приложениям как раз было несколько токсичных отзывов, и они все от иностранцев (один из Нидерландов, другой из Португалии).

А что на счёт платить, тут сильно зависит от того, как представить товар, и какую цену выставить. Если цена адекватная, то и целая огромная очередь выставиться желающих заплатить. Иначе, если цена лишком большая (например, просто тупо преобразовать цены по курсу иностранных валют), то такуе не только не купят, а ещё польют грязью, что так бестолкого и чрезвычайно дорого. От этого огребают и крупные компании.

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

По ЗЫ, чего-то я припоминаю про стиляг и про их слэнг, действительно недолго прожил.

Меня в последнее время подобные англицизмы раздражают. Я абсолютно не против, если они использутюся для обозначения уникальных понятий и явлений, для которых нет лаканичных и понятных эквивалентов. Но вот когда слова используются просто в разговоре, заменяя обычные слова - это нечто бессмысленнное и отвратное. В японском языке аналогично можно встретить тьму заимствований (их легко отличить по катаканной записи), и много слов среди них - англицизмы. Французы в последнее время вообще молоцы, что осознанно решили заботиться о чистоте своего языка, и я их полностью в этом поддерживаю. Язык - это не только средство для общения, но и носитель многовековой культуры своего народа. Изучая какой-либо иностранный язык, мы неприменно изучаем и культуру его народа. Когда язык смешивается с другим, то теряется культурная уникальность, и это грустно.

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

На Onlime-е да, 25й порт закрыт, и мой друг перешёл с него на 2COM, и прекрасно тот всё сделал, и статический адрес, и все порты открыты, в том числе 25й, и т.п.
У меня SevenSky, и они легко настроили. Написал им в тех-поддержку, прислал им данные, какие надо, и сделали. Возможность зависит от того, имеет ли провайдер собствнный DNS-сервер или нет. И выдаёт ли он белые IP-адреса пользователям, или нет (например, выдаются псевдо-белые).
Почтовый сервер гоняю свой с 2010го года, прямо у себя дома, в кладовке. Верно, чтобы нормально организовать свой почтовый сервер, нужно предусмотреть чтобы:
— 25й порт был открыт всегда. Провайдеры некоторые, деловые колбасы, по умолчанию его закрывают, потому якобы спам-сервера чтоб не гоняли.
— Обязательно, чтобы сервер был со статическим IP-адресом, если он динамический, то много кто (например, MailRu) заворачивает письма, ругаясь, что не берём почту с динамических IP-адресов.
— На IP-адрес почтового сервера обязательно должна ссылаться PTR-запись, указывающая на основной почтовый домен сервера (у проайдера запрашивать надо)
— Остальное в виде DKIM и т.п. чисто, чтобы увеличить вероятность попадания во входящие, а не в спам. Даже где-то есть сервис (и не один) по проверке настройки почтовых серверов.
— Некоторые люди требуют, чтобы почту им слали в формате обычного текста, заверяя, что форматированные письма они удаляют по умолчанию как спам (один знакомый японец точно).
— Некоторые почтовые службы требуют, чтобы почтовый сервер существовал в течении какого-то времени (у MailRu например, два-три месяца), прежде чем почта с него начнёт приниматься.

Что на счёт звонков, то уже давно поставил себе и всем «Не бери трубку», чтобы видеть, кто звонит, и т.п. А то достали все эти роботы и рекламщики.

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

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность

Специализация

Фулстек разработчик, Разработчик игр
Старший
C++
Git
Cmake
Linux
Bash
Unix
ООП
Базы данных