Вопрос о создании программы с нуля - PullRequest
0 голосов
/ 20 сентября 2019

Я всю свою жизнь строил свои игры и программы на основе готовых программ, Unity, Unreal, Python и т. Д. Но я так и не узнал, как это стандартно делается в отрасли, да, движки крутые, но они тожевызывают проблемы, такие как наличие ограничений на то, что вы можете сделать, а также необходимость обходить ошибки и т. д. Но давайте посмотрим на другое программное обеспечение: MS Office, 7Zip, Evernote, Firefox, Youtube, приложение Amazon Alexa, Inkscape, Autodesk cad, Photoshopи т.д. Это всего лишь несколько случайных примеров, но они НЕ были встроены в движок, но все же могут быть кроссплатформеннымиКакие навыки / языки требуются для этого?Чтобы быть ясным, я не прошу чудесного ответа, который может рассказать мне все, что мне нужно знать, но я ищу руководство по инструментам, используемым для создания таких вещей.Это C ++?Это OpenGL?Я все еще думаю слишком высоко?Я не знаю много об этом, но это правильное направление?Я слышал о таких вещах, как электрон, но я думаю, что вы могли бы рассмотреть это больше двигатель.Я не могу представить, чтобы эти компании делали это на бинарном уровне, я думаю, что было бы абсурдно делать это для каждой программы в такой эпохе, что также невозможно для таких стартапов, как Mozilla и Evernote, как совершенно новые компании без большой компании.сумма (если есть) поступающей выручки.В конце концов, я думаю, что я спрашиваю, каков отраслевой стандарт при создании кроссплатформенных программ?Какие инструменты они используют?И из каких источников я мог бы поучиться, чтобы узнать об этом?


PS Чтобы было ясно, я понимаю, что такие вещи, как Evernote, Youtube, Alexa App и т. Д., Имеют свои бэк-энды, но я неГоворя о них, я в первую очередь имею в виду интерфейс, хотя я думаю, что какой бы стандарт ни был способен, он сможет обработать его.

1 Ответ

3 голосов
/ 20 сентября 2019

Ex-Middleware Game Dev здесь.Чтобы заставить что-либо работать на любой данной платформе, на самом низком уровне вам нужно будет начать доступ к ОС или аппаратным API-интерфейсам (например, в Windows, CreateFile, чтобы открыть файл, или open () вLinux).Стандартные библиотеки C / C ++ основаны на этих API, чтобы обеспечить несколько универсальную платформу для построения кроссплатформенных приложений.

Реально, однако, stdlib C ++ не слишком полезен в этом отношении, главным образом потому, что такие вещи, как графика, оконные API и т. Д .;все они находятся за пределами компетенции stdlibs.Еще одна большая проблема для нас, разработчиков игр, с помощью стандартных команд C ++ на консоли, заключается в том, что их поведение направлено на «общий случай», а не на конкретную платформу.Возьмем для примера функции cmath.Я ни при каких обстоятельствах не собираюсь вызывать крайне неэффективную реализацию std :: sin ().std :: sin хорош в одном отношении - он обрабатывает ненормальные числа, правильно идентифицирует NAN / INF и имеет хорошо описанный метод сообщения об ошибках.

В мире игрового движка мы склонны тратить много времени на предварительную выпечку активов, чтобы эти INFs / NAN никогда не могли участвовать в игровых вычислениях.Таким образом, обработка этих вещей во время выполнения - пустая трата времени, поэтому мы обычно пишем свои собственные математические приближения (мы не высадим человека на Луну, мы просто бросаем несколько штук на экран, поэтому мы обычно не делаемнужна точность, обеспечиваемая stdlibs).

Так как бы организовать типичную кроссплатформенную игру?Вы, вероятно, увидите структуру каталогов, похожую на эту:

game/
  platform/          //< contains all OS specific code (timers, mutexs, etc)
  vpu/               //< wrappers over the SIMD instructions on the platform
  maths/             //< fast versions of cmath + Vectors/Quats/Matrices/etc
  graphics/          //< wrappers over the core graphics APIs
  sound/             //< wrappers over the platform specific audio stuff

Это в значительной степени «платформа», против которой написан весь другой код (иными словами, мы в основном заканчиваем тем, что пишем свои собственные).версия C ++ stdlib для каждой новой платформы).Несмотря на то, что над этим уже проделана большая работа, обычно разумно просто переписать всю библиотеку кода, когда появится новая аппаратная платформа (например, Playstation 6, XBox 99 и т. Д.).Конечно, это меньше работы, чем переписывание всей игры.

В некоторых случаях есть кое-что из этой работы, которое не изменится (например, iOS и Android используют процессоры ARM, поэтому математические процедуры оптимизированы для ARM NEONбудет совместно использоваться обоими, как и графические процедуры OpenGLES).

Если повезет, 99,99% кода игр не нужно будет модифицировать.Если повезет - во многих случаях нам не так повезло :( [Хотя сейчас это легче, чем десять лет назад!]

Все часто (особенно на консоли), к началу разработки игрвы нацелитесь на свои прекрасные абстрагированные библиотеки ядра, и все будет хорошо. По мере того, как вы приближаетесь к концу проекта, вы, вероятно, получите загрузку #ifdef XBOX определяет, что использует конкретный прирост производительности этого конкретного оборудования (мынужно достичь этой цели 60fps, и нам все равно, как т. ч.). В крайних случаях вы можете обнаружить, что для конкретной платформы требуется столько оптимизаций для конкретной платформы (скажем, для рендерера), что она фактически превратилась в совершенно новыйбиблиотека только для этой платформы.

Во всяком случае. Эта ситуация немного отличается на ПК и Android - просто потому, что разнообразие оборудования является значительным (в отличие, скажем, от XBOX, где все они идентичны!). В этих случаяхмы будем писать код для уже абстрагированного API (например, OpenGL, OpenAL, D3D и т. д.),d нам нужно будет вставить гораздо больше проверок ошибок во время выполнения, чем на консоли (например, на консоли мы можем знать, что у нас есть 256 МБ оперативной памяти.На Android это может быть 32Mb, это может быть 2Gb, кто знает!Неважно, мы должны изящно обрабатывать сбои).

Когда дело доходит до настольных приложений, для оконных API-интерфейсов подавляющее большинство здравомыслящих людей сейчас используют QT (возможно, с OpenGL, если им нужен 3D-рендеринг).

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