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

39

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

Матиас Вальденегро
источник

Ответы:

44

Скрыть что-нибудь платформенное за слоями абстракции

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

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

Не принимайте определенную структуру памяти или порядковый номер в ваших данных

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

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

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

необычайно щедрый
источник
2
отсутствие #ifdef PLATFORM_WINftw
tenpn
Вы никогда не избежите этого. Вы можете просто надеяться свести это к минимуму.
Великолепно
8
Хороший способ сделать это - переместить весь специфичный для платформы код в набор общих библиотек с тем же интерфейсом, после чего вы можете ограничить # ifdef загрузкой правильной библиотеки для платформы.
Нил
1
+1, отличный комментарий. Помните, что даже STL зависит от платформы (и да, некоторые функции выполняют разные функции на разных компиляторах).
Саймон
Конечно, вызов дополнительной функции снизит производительность? Процессор должен загружать или перемещать данные из регистров или, что еще хуже, памяти, которая все еще работает медленно. Разве системного вызова не будет достаточно?
TheBlueCat
10
  • Используйте API, такой как opengl / sdl, который даст вам минимальные хлопоты при переходе с платформы на платформу.

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

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

SD021
источник
Второй момент не может быть подчеркнут достаточно. Убедитесь, что вы знаете, для кого предназначена игра (это означает, что, если это казуальная игра, вы хотели бы иметь ее как минимум на OSX и Windows, таким образом, OpenGL будет лучшим вариантом). Что касается третьего пункта - и это где двигатель вступает в игру - также важно. Было бы нелогично использовать многофункциональный, ресурсоемкий движок, такой как Unreal, для создания DS-игры. Этот вопрос также связан с тем, что я сказал относительно второго: установить, для кого предназначена игра. Если вы собираетесь в казуальную игру, компьютеры большинства людей не будут обрабатывать, скажем, частицы.
7

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

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

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

NocturnDragon
источник
4

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

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

Karantza
источник
4

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

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

kevin42
источник
+1 * 9000. Я полагаю, что это действительно относится только к мобильным телефонам с точки зрения современной / используемой архитектуры (RISC); но все еще важно.
Джонатан Дикинсон