Есть ли у вас какие-либо советы / рекомендации при создании кроссплатформенной игры на C / C ++?
Есть ли у вас какие-либо советы / рекомендации при создании кроссплатформенной игры на C / C ++?
Ответы:
Скрыть что-нибудь платформенное за слоями абстракции
Это означает такие вещи, как рендеринг, аудио, пользовательский ввод и файловый ввод-вывод. Одним из распространенных приемов абстрагирования, заключающихся в том, что без снижения производительности во время выполнения являются независимые от платформы заголовки с файлами реализации для конкретной платформы:
// FileSystem.h
class FileSystem {
public:
FileHandle OpenFile(const char * path);
// other stuff...
}
// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
// call windows API...
}
Затем настройте сборки для каждой платформы для сборки с соответствующим файлом .cpp.
Сделайте так, чтобы ваши конвейеры контента читались в независимых от платформы ресурсах и выводили контент для каждой платформы для каждой платформы.
Например, создайте ваши текстуры как .tga или просто .psd, а затем создайте конвейер, который может автоматически преобразовывать их в различные форматы, специфичные для вашей платформы.
Не принимайте определенную структуру памяти или порядковый номер в ваших данных
Платформы могут различаться по порядку байтов, заполнению, выравниванию и размеру слова. Любой код, который заботится об этом, должен быть тщательно протестирован на всех платформах.
Тест на всех платформах, все время
Вы будете укушены ошибками, специфичными для платформы. Вы бы предпочли укусить сейчас или прямо, когда вы пытаетесь вывести игру за дверь?
Используйте API, такой как opengl / sdl, который даст вам минимальные хлопоты при переходе с платформы на платформу.
Убедитесь, что вы знаете, какие платформы вы хотите поддерживать. Не используйте opengl только потому, что вы думаете, что в будущем вы захотите поддерживать мультиплатформенность. Начните, как вы хотите продолжить.
Узнайте, какие аппаратные ограничения существуют на каждой платформе, которую вы хотите поддерживать.
Старайтесь не разбрасываться #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endif
по всему коду.
Иногда это выглядит так, как будто это более простой способ, но в конечном итоге это доставит вам неприятности. Вы должны попытаться ограничить их собственным файлом, чтобы каждая реализация платформы была автономной.
Добавление платформы должно сводиться в основном к добавлению новых файлов реализации и просто к изменению нескольких необходимых существующих.
Есть много библиотек, которые сами кроссплатформенны; вам не нужно писать прямо в OpenGL, чтобы работать где угодно. OGRE - отличный пример движка рендеринга, который работает на любой платформе, которую вы хотели бы назвать.
По моему опыту, самая большая проблема - ваша система сборки. Если вы разрабатываете для Windows с Visual Studio, ваш код может скомпилироваться в Linux, но вам будет нелегко его легко собрать . Посмотрите на системы сборки, такие как CMake, которые могут использовать те же инструкции по сборке для создания файлов проектов для конкретной платформы (make-файлы в linux, VS Projects в Windows, XCode Projects в Mac и т. Д.).
При написании своих функций для сохранения и загрузки файлов или общения по сети не забывайте о порядке байтов .
Вместо чтения большой структуры с помощью одного вызова fread / fwrite или чего-то подобного низкого уровня, создайте ReadByte / WriteByte и ReadFloat / WriteFloat. Тогда у вас будет меньше мест для внесения изменений, если позже вы решите выбрать другую платформу.
#ifdef PLATFORM_WIN
ftw