2013-02-17 5 views
1

Я разрабатываю двумерную бесконечную прокручивающую игру. Когда игрок движется вправо, я продолжаю добавлять случайный сегмент плитки в мир, чтобы он был бесшовным и «бесконечным». Как показано ниже, случайный сегмент добавляется, когда правая сторона области просмотра достигает синей области.Самый эффективный способ управления частым приданием данных

Illustration

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

Мировые плитки представлены в 2D-массиве, а функция добавления в мир выглядит примерно так.

Array.Resize<Tile[]>(ref world.Tiles, newWidth); 

for (int x = 0; x < newSegment.Width; x++) 
{ 
    world.Tiles[oldWidth + x] = newSegment.Tiles[x]; 
} 

Я понимаю, что List<T> идеально подходит для динамической коллекции объектов, но имейте в виду, что там будет потенциально тысячи колонн. Если я предполагаю это правильно, многие элементы списка, особенно вложенные, принесут много накладных расходов. По этой причине я пошел с массивами изначально.

Неужели мой нынешний подход неэффективен? Если да, то как мне удается часто (каждые 10-15 секунд в среднем) добавлять случайный сегмент в мир?

ответ

2

Как насчет LinkedList <T>? В вашем случае LinkedList<Tile>

Или, может быть, даже лучше, Queue<T>? Очередь может быть лучше для накладных расходов, если все, что вы делаете, это Enqueue-ing Tiles и перемещение в одном направлении (нет необходимости/возможности перейти к предыдущей плитки.)

С любой коллекцией LinkedList или Queue , нет необходимости изменять размер массива, а не самого себя. Управление памятью осуществляется внутренне и эффективно.

+0

'Queue', вероятно, лучше всего подходит для игры из-за гарантированной лучшей локальности памяти и того факта, что она не генерирует мусор (предоставление' Tile' - это тип значения). –

Смежные вопросы