Якісь поради щодо створення кросплатформних ігор? [зачинено]


Відповіді:


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
  • Використовуйте такий формат, як opengl / sdl, який дасть вам мінімум клопотів при переході з платформи на платформу.

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

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


Другий момент не може бути достатньо наголошений. Переконайтеся, що ви знаєте, на кого спрямована гра (тобто, якщо це випадкова гра, ви хочете мати її принаймні на OSX та Windows, тому OpenGL був би найкращим варіантом). Щодо третього моменту - і тут рухається двигун - також важливо. Було б нелогічно використовувати багатофункціональний двигун, важкий для ресурсів, як Unreal, щоб створити гру DS. Справа також пов'язана з тим, що я сказав щодо другого: Встановіть, на кого спрямована гра. Якщо ви збираєтесь у випадкові ігри, комп'ютери більшості людей не оброблять, скажімо, частинок.

7

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

Іноді це виглядає так, що це простіший шлях, але це доставить вам неприємності в перспективі. Вам слід спробувати обмежити їх власним файлом, щоб кожна реалізація платформи була самодостатньою.

Додавання платформи повинно здебільшого стосуватися додавання нових файлів реалізації, а також лише змінити кілька необхідних існуючих.


4

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

На мій досвід, найбільше турбує ваша система збирання. Якщо ви розробляєте в Windows за допомогою Visual Studio, ваш код може збиратися в Linux, але у вас буде непростий час, щоб його легко створити . Подивіться на такі системи збирання, як CMake, які можуть використовувати ті самі інструкції побудови для генерації конкретних платформних файлів проектів (makefiles на Linux, VS Projects на Windows, XCode Projects на Mac тощо).


4

Коли ви пишете свої функції для збереження та завантаження файлів або спілкування по мережі, не забувайте про небезпеку .

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


+1 * 9000. Я думаю, це дійсно стосується мобільних телефонів лише в умовах сучасної архітектури (RISC); але все ще вирішальне значення.
Джонатан Дікінсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.