Структура даних у старих іграх


10

Мені цікаво структури даних, які використовуються при програмуванні старих ігор, таких як Super Mario Brothers для NES та Super Mario World для SNES. Я розумію, що ігри цього періоду писалися в зборах. Чи визначили / використовували будь-які структури даних програмісти?

Наприклад: коли на екрані з’являється група монет, як вони зберігаються? Чи програмісти просто використовували масиви? Чи, можливо, вони мали пов'язані списки?

Ура!

Редагувати : Мене цікавлять різні підходи ... не обов'язково універсальний підхід.

Редагувати 2 : У деяких моїх іграх я використовую (потенційно поганий) підхід до колекцій, і я хочу знати, чи використовувала хтось із старих ігор подібний підхід. Мені подобається робити наступне:

// statically allocated arrays (max number of coins is 4)
int coinsXs[4] = {0, 0, 0, 0};
int coinsYs[4] = {0, 0, 0, 0};

// bitset that keeps track of which coins are active
int coinsActive = 0;

// ...

// update the active coins in an update function
for(int i = 0; i < 4; i++){
    if(coinsActive & (1 << i)){
        // update ith coin
    }
 }

2
Універсальної відповіді немає; це зводиться до того, як заданий програміст реалізував рішення для заданої проблеми.
Ред С.

1
Хоча я не думаю, що всі ці ігри були написані на зборах, я скажу, що програмісти з монтажу досить звично збирали свої невеликі компоненти для повторного використання копіювання / вставки з програми в програму. Скільки разів ви хочете записати функцію printf () після закінчення? :)
Джеймс

Гарна думка. Мені дуже цікаво динамічно розподілені колекції проти статично розподілених колекцій
MrDatabase

1
Яка конкретна проблема у вас є? Чому тобі все одно, що роблять старі ігри?
Тетрад

2
Що ви отримали у своїй другій редакції, це приклад структури "масивів масивів", яка залишається поширеною навіть у сучасних іграх, оскільки вона має переваги для паралелізму та роботи SIMD. Кілька років тому Sony зробила презентацію про те, як традиційний спосіб структурування даних на C ++ може мати серйозні приховані витрати на парфуми: research.scee.net/files/presentations/gcapaustralia09/…
Crashworks

Відповіді:


13

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

Різниця полягає в тому, що перед STL, і з настільки критичною продуктивністю, нам зазвичай доводилося писати структури та алгоритми самі!

Девід Бребен виступив із цікавою лекцією в 2011 році на GDC, де розповів про всі шалені хитрощі, якими він користувався, щоб вписати Elite на BBC Micro в 1984 році. Ви можете переглянути його безкоштовно у Сейді GDC .


Класно. Чи використовували ви динамічно розподілені масиви? Або більшість мали статичний розмір? Мені цікаво ситуацій, коли, скажімо, п'ять монет з’являться на екрані і залишатимуться на екрані, поки гравець не збирає їх (або вони прокручуються поза екраном).
MrDatabase

2
@MrDatabase - Статичні розподіли, де це можливо. У таких випадках, як ви описуєте, ми часто маємо статично виділений масив, наприклад, 32 можливі монети, які могли б існувати. Коли монети з’явилися у світ, ми б заповнили місце в масиві. Коли вони пішли, ми його видалимо. Динамічний розподіл не був доступний, ми просто уникали його використовувати, тому що, коли у вас є лише 2 Мб оперативної пам’яті, вам дійсно потрібно гарантувати, що програма працює в постійній пам'яті!
Crashworks

Класно. Я роблю щось подібне (див. Редагування №2 до питання). У своїй функції оновлення я перевіряю "coinsActive" біт, if(coinsActive)перш ніж переходити на maxNumCoins та оновлювати. Таким чином я повністю уникаю циклу, якщо активні нульові монети.
MrDatabase

+1 через посилання GDC Vault. Посмертна поспільська розмова Пітера Моліне повинна бути найсмішнішою розмовою, яку я бачив.
TravisG

MeDataBase - ви копіюєте останній активний об’єкт у слот, який був зайнятий монетою, яка стала неактивною (тобто, якщо у вас є 10 монет, монета 5 стає неактивною, скопіюйте монету 10 в слот 5 і зменшіть кількість монети), ви можете просто повторити для numCoins та оновлення всіх цих елементів. Вам не потрібно «якщо». Звичайно, це працює лише в тому випадку, коли неактивним монетам не потрібно підтримувати стан і якщо порядок оновлення не важливий (стан може бути збережений, якщо масив зберігає покажчики на монети, а не фактичні монети, але тоді ви отримуєте розповсюджений кеш-поведінку, яке є ймовірно, гірше, ніж "якщо")
Кай

5

Ось цікава дискусія на GameDev.net для вихідного коду Super Mario Bros: вихідний код Super Mario

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.