Любые советы по созданию кросс-платформенных игр? [закрыто]

Есть ли у вас советы /рекомендации при создании кросс-платформенной игры на C /C ++?

38 голосов | спросил Matias Valdenegro 1 Jam1000000amThu, 01 Jan 1970 03:00:00 +030070 1970, 03:00:00

5 ответов


42

Скрыть все слои, относящиеся к платформе, за слоями абстракции

Это означает, что такие вещи, как рендеринг, аудио, пользовательский ввод и файл ввода-вывода. Одним из распространенных трюков для абстрагирования этого, не вызывая ограничения производительности во время выполнения, являются ассемблерные заголовки платформы с конкретными файлами реализации платформы:

// 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, затем создайте конвейер, который может автоматически преобразовать их в разные форматы платформы, которые вам нужны.

Не предполагайте, что в ваших данных будет определен конкретный макет или контенте памяти

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

Тест на всех платформах все время

Вы будете укушены ошибками конкретной платформы. Вы предпочли бы укусить сейчас или сразу, когда вы попытаетесь вытащить игру из двери?

ответил Theraot 1 PM00000010000000731 2017, 13:54:07
10
  • Используйте api, как opengl /sdl, который даст вам минимальную проблему при переходе с платформы на платформу.

  • Убедитесь, что вы знаете, какие платформы вы хотите поддерживать. Не используйте opengl только потому, что считаете, что в будущем вам может понадобиться поддержка нескольких платформ. Начните с того, что вы хотите продолжить.

  • Знайте, какие аппаратные ограничения существуют на каждой из платформ, которые вы хотите поддерживать.

ответил Theraot 1 PM00000010000000731 2017, 13:54:07
7

Старайтесь избегать рассеяния #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endif по всему коду.

Иногда это похоже на то, что это более простой способ, но в конечном итоге это вызовет проблемы. Вы должны попытаться ограничить их собственным файлом, чтобы каждая реализация платформы была автономной.

Добавление платформы должно быть в основном связано с добавлением новых файлов реализации и просто изменением нескольких необходимых существующих.

ответил Theraot 1 PM00000010000000731 2017, 13:54:07
4

Существует множество библиотек, которые сами по себе являются кросс-платформенными; вам не нужно писать напрямую в OpenGL для работы в любом месте. OGRE - отличный пример механизма рендеринга, который работает на любой платформе, которую вы хотите назвать.

По моему опыту, самая большая проблема - ваша система сборки. Если вы работаете в Windows с Visual Studio, ваш code может быть скомпилирован в Linux, но вам будет трудно получить его build легко. Посмотрите на такие системы сборки, как CMake, которые могут использовать одни и те же инструкции по сборке для создания файлов проектов, специфичных для платформы (make-файлы на linux, VS Projects на окнах, проекты XCode на Mac и т. Д.).

ответил Theraot 1 PM00000010000000731 2017, 13:54:07
4

При написании своих функций для сохранения и загрузки файлов или передачи по сети не забывайте о endianness .

Вместо того, чтобы читать большую структуру с помощью одного вызова fread /fwrite или чего-то такого низкого уровня, создайте ReadByte /WriteByte и ReadFloat /WriteFloat. Тогда у вас будет меньше мест для внесения изменений, если вы решите позже настроить таргетинг на другую платформу.

ответил Theraot 1 PM00000010000000731 2017, 13:54:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132