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-рендеринг).