/ / Чи варто переносити портативність, чому варто перейматися, застосовуючи базову бінарну серіалізацію для відеоігри? - c ++, linux, windows, серіалізація

Чи варто турбуватися про портативність, впроваджуючи базову бінарну серіалізацію для відеоігри? - c ++, linux, windows, серіалізація

Я пишу простий двійковий серіалізатор догенерувати файли збереження для 64-розрядних відеоігор, націлених на 64-бітні платформи Windows, Mac та Linux. Типи змінних, вибраних для серіалізації, є: char, short, bool, без знака int, int, float, можливо, подвійний та, можливо, довгий int. Я складаю на Visual Studio. Серіалізація є максимально простою, без перевірок, просто простим записом бінарних даних, а потім десеріалізацією даних у тому ж порядку. Гра зберігає нові дані у файл дуже часто протягом гри, але дані дезаріалізуються лише один раз, безпосередньо перед грою.

Я не думав, що портативність - це щосьщо мені потрібно було турбуватися за допомогою простої функції збереження гри; однак я читав про багато проблем переносимості, пов’язаних з двійковою серіалізацією (наприклад, представлення з плаваючою комою, варіації бітової ширини ints, нестабільність, вирівнювання тощо), і я не впевнений у своєму розумінні теми, щоб бути певним що ці проблеми з портативністю не піднятимуть голову цьому проекту. Можливо, хтось був би таким добрим, щоб поділитися певним поглядом на наступні припущення:

  1. Змінні можуть бути серіалізовані до двійкових на одній машині та двійковий файл може бути скопійований і безпечно десеріалізований на a інша машина з тією ж ОС і процесором x86-64.
  2. Якщо припустити, що всі машини, на яких працюєгра - це процесори стилю x86-64 в стилі x-64, що мають 64-бітні операційні системи, чи можу я припустити, що двійковий файл може бути повністю переносним між операційні системи теж?
  3. Якби я розширив розвиток, щоб підтримати32-розрядна версія гри (як і раніше припускає архітектуру процесора x86-64) платформа, але 32-розрядна ОС), і 32-бітний ОС кінцевий користувач вирішує оновлення до 64-бітної ОС, встановлює 64-бітну версію гри та потім завантажує свій старий файл збереження, який був серіалізований на 32-бітному ОС, в якій працює 32-розрядна версія гри - чи можуть бути ці змінні типи то безпечно десеріалізуйте на 64-бітній платформі в порядку в для чого вони були серіалізовані без будь-яких перевірок чи тестів сумісність?

Чи можливо збереження на одній машині та завантаження на іншому може пошкодити дані в будь-якому з цих сценаріїв?

Велике спасибі заздалегідь.

Відповіді:

1 для відповіді № 1

Якщо ви використовуєте цілі типи розмірів, такі як ::std::uint32_t замість незрозумілих типів, таких як unsigned long тоді ви будете значно врятувати від цілого числаваріації розмірів, які можуть виникати між 32-бітними / 64-бітовими платформами та різними компіляторами. Технічна біт-ширина в технічному відношенні може відрізнятися, але лише на досить екзотичних платформах, які точно не можна вважати придатними для ігор. Розмір і представництво з плаваючою точкою також не повинні викликати занепокоєння.

Щоб переконатися, що розмір та вирівнювання структур даних, що читаються / записуються, залишаються послідовними на всіх платформах, які слід використовувати static_assert у вашому коді.

Однак перевірка витривалості є обов'язковою, якщо вихочете, щоб файли збереження були портативними. Зазвичай ви можете захотіти серіалізувати дані, використовуючи рідну ендіанність, і записати якесь магічне число на початку файлу із зазначенням його ендіанності ( 0x01020304). Потім, коли ви десеріалізуєте, ви спочатку перевіряєте цю магію і вибираєте або рідний десенсіалізатор ендіанності (що швидше), або десіріалізатор фліп-ендіансу (що повільніше).