Пример массива от Чэд Фримен:
При использовании указателей и динамического выделения памяти связанный список может выглядеть примерно так:
Содержимое адресов памяти
001 [Указатель на первый элемент (010)]
002 [Указатель на последний элемент (062)]
...
010 [Указатель на графическое представление объекта]
011 [Здоровье]
012 [Указатель на следующий элемент (053)]
...
053 [Указатель на графическое представление объекта]
054 [Здоровье]
055 [Указатель на следующий элемент (098)]
...
062 [Указатель на графическое представление объекта]
063 [Здоровье]
064 [Указатель на NULL (конец списка)]
...
098 [Указатель на графическое представление объекта]
099 [Здоровье]
100 [Указатель на следующий элемент (062)]
Если вы забудете освободить одну из этих структур, занимаемая ею память будет потеряна до момента выхода из игры. Кроме того, эти структуры разбросаны по всей памяти, так что независимо от порядка просмотра списка без подкачки обойтись не удастся.
При использовании массива реализация может выглядеть следующим образом:
Заголовок списка:
Первый [индекс первого объекта - 001]
Последний [индекс последнего объекта - 003]
Список:
Индекс массива - данные - индекс следующего элемента
001 Данные объекта 1 002
002 Данные объекта 4 004
003 Данные объекта 2 -1
004 Данные объекта 3 003
Применяя массив, невозможно потерять ни бита памяти, поскольку у вас всегда будет целиком заполненный массив - не более и не менее. Кроме того, если ваша функция добавляет объект в список, находя первое пустое место в массиве, можно просмотреть весь список по порядку с первого элемента по последний, сохраняя связность буфера.
При использовании этого метода в игре Warwind было задействовано множество списков, и все они имели дело с одним массивом. Общий модуль выполнял просмотр массива сверху донизу. Когда нам было необходимо выполнить обработку для конкретного игрока, мы просматривали список объектов данного игрока. Когда должна была выполняться обработка для некоторых типов элементов, мы просматривали соответствующий список и так далее.
И еще несколько слов о гибкости:
Это то, с чем вы сталкиваетесь всякий раз, когда создаете игру. По сути, программируя, вы пытаетесь предсказать будущее и неизбежно делаете предположения, которые в дальнейшем окажутся неверными. Однако предположения могут быть как хорошими, так и плохими. В Warwind мы решили, что каждая машина должна иметь точное представление о состоянии игры в каждом кадре. Это было неудачное предположение, поскольку в Интернете, где время ожидания велико, а потеря пакетов - обычное дело, синхронизация каждого кадра замедляет игру до скорости улитки.
Чтобы знать все о компании Dreamforge Intertainment, ее служащих и играх, обратитесь на веб-сайт www.dreamforge.com.
Стюарт Денман (Stuart Denman), Surreal Software
Стюарт Денман - вице-президент и технический директор Surreal Software, многообещающей компании, ответственной за игру Drakan (издатель Psygnosis).
Не чужой в программировании, Стюарт утверждает, что одним из наиболее важных критериев при создании экшен-игр является скорость вывода графики на экран. Ниже перечислены три основных потребителя памяти, чье влияние на частоту кадров вас вряд ли устроит, если только вы скрупулезно над ними не поработаете.