В настоящее время я работаю над кросс-платформенными приложениями, и мне было любопытно, как другие люди решат такие проблемы, как:
- порядок байтов
- Поддержка плавающей точки (некоторые системы эмулируют программное обеспечение, очень медленно)
- Системы ввода/вывода (например, отображение, звук, доступ к файлам, сетевое взаимодействие и т.д.).
- И, конечно же, множество различий в компиляторах
Очевидно, что это ориентировано на такие языки, как c/С++, которые не абстрагируют большую часть этого материала (в отличие от java или С#, которые не поддерживаются во многих системах).
И если вам было любопытно, системы, которые я разрабатываю, это Nintendo DS, Wii, PS3, XBox360 и ПК.
EDIT
Здесь было много действительно хороших ответов, начиная от того, как справляться с различиями самостоятельно, с предложениями в библиотеке (даже с предложением просто сдавать и использовать вино). Я на самом деле не ищу решение (уже есть), но было просто любопытно, как другие справляются с этой ситуацией, так как всегда приятно видеть, как другие думают/кодируются, чтобы вы могли продолжать развиваться и расти.
Вот как я решил проблему (и, если вы не догадались из этого списка систем выше, я разрабатываю консольные/оконные игры). Пожалуйста, имейте в виду, что в системах, в которых я работаю, обычно нет кросс-платформенных библиотек, уже написанных для них (Sony фактически рекомендует писать свой собственный механизм рендеринга с нуля и просто использовать их реализацию OpenGL, что не совсем соответствует стандарты в любом случае, как ссылка).
порядок байтов
Все наши активы могут быть изготовлены на заказ для каждой системы. Все наши исходные данные (за исключением текстур) хранятся в XML, которые мы конвертируем в бинарный формат системы, когда проект построен. Видя, как мы развиваемся для игровых консолей, нам не нужно беспокоиться о передаче данных между платформами с разными форматами endian (только ПК позволяет пользователям делать это, поэтому он также изолирован от других систем).
Поддержка плавающей точки
В большинстве современных систем значения с плавающей запятой прекрасны, исключением является Nintendo DS (и GBA, но в наши дни это довольно мертвая платформа). Мы справляемся с этим через два разных класса. Первый - это класс с фиксированной точкой (templated, может указывать, какой тип целого использовать и сколько бит для десятичного значения), который реализует все арифметические операторы (заботясь о сдвиге бит) и автоматизирует преобразования типов. Второй - это класс с плавающей запятой, который по большей части является просто оболочкой вокруг поплавка. Единственное отличие заключается в том, что он также реализует операторы сдвига. Внедряя операторы сдвига, мы можем использовать бит-сдвиги для быстрых умножений/делений на DS, а затем плавно переходить на платформы, которые лучше работают с поплавками (например, XBox360).
Системы ввода/вывода
Это, наверное, самая сложная проблема для нас, потому что у каждой системы есть собственный метод ввода контроллера, графика (XBox360 использует вариант DirectX9, у PS3 есть OpenGL, или вы можете писать свой собственный с нуля, а DS и Wii имеют собственные собственные системы), звук и сеть (на самом деле только DS отличается в протоколе много, но тогда у каждого из них есть своя собственная серверная система, которую вы должны использовать).
То, как мы закончили эту работу, заключалось в том, чтобы просто написать довольно высокоуровневые обертки для каждой из систем (например, сетки для графики, системы сопоставления клавиш для контроллеров и т.д.), и чтобы все системы использовали одни и те же заголовочные файлы для доступа, Затем это просто вопрос написания конкретных файлов cpp для каждой платформы (таким образом формируя "движок" ).
Различия в компиляторах
Это одна вещь, с которой нельзя справиться слишком легко, так как мы сталкиваемся с проблемами с компиляторами, мы обычно регистрируем информацию в локальной вики (чтобы другие могли видеть, что искать и обходные пути, чтобы пойти с ней), и если возможно, напишите макрос, который будет обрабатывать ситуацию для нас. Хотя это не самое элегантное решение, оно работает и видит, как некоторые компиляторы просто сломаны в определенных местах, более элегантные решения, как правило, ломают компиляторы в любом случае. (Я просто хочу, чтобы все компиляторы выполнили команду Microsoft "#pragma once", что намного проще, чем обернуть все в # ifdef's)