Программирование на C #: ведение списка, который быстро связывает идентификатор с информацией - PullRequest
1 голос
/ 13 августа 2011

В игре, над которой я работал, я создал систему, в которой игра опрашивает определенный файл 'ItemDatabase', чтобы получить информацию о себе на основе заданного идентификационного номера. Идентификационный номер представляет точку в базе данных, в которой хранится информация, касающаяся конкретного элемента. Представление каждого элемента в базе данных состояло из 162 байтов. Код для системы был похож на следующее:

// Retrieves the information about an 'Item' object given the ID.  The 
// 'BinaryReader' object contains a file stream to the 'ItemDatabase' file.
public Item(ushort ID, BinaryReader itemReader)
{
    // Since each 'Item' object is represented by 162 bytes of information in the 
    // database, skip 162 bytes per ID skipped.
    itemReader.BaseStream.Seek(162 * ID, SeekOrigin.Begin);

    // Retrieve the name of this 'Item' from the database.
    this.itemName = itemReader.ReadChars(20).ToString();
}

Обычно в этой системе не было бы ничего особенно плохого, поскольку она запрашивает нужные данные и инициализирует их правильными переменными. Однако этот процесс должен происходить во время игры, и, основываясь на моих исследованиях эффективности метода «Поиск», эта техника не будет достаточно быстрой для включения в игру. Итак, мой вопрос: как правильно вести список, который связывает идентификационный номер с информацией, к которой можно быстро получить доступ?

Ответы [ 3 ]

1 голос
/ 13 августа 2011

Предполагая, что информация в «базе данных» не меняется непрерывно, не могли бы вы просто зачитать разовые предметы во время загрузки игры или уровня? Вы можете хранить данные различными способами, такими как словарь. На самом деле .Net Dictionary - это то, что обычно называют хеш-таблицей, отображающей ключи (в данном случае, ваше поле идентификатора) на объекты (которые, как я предполагаю, имеют тип «Item»). Время поиска очень хорошее (определенно в миллионах в секунду), я сомневаюсь, что у вас когда-нибудь возникнут проблемы.

В качестве альтернативы, если ваш идентификатор - это ushort, вы можете просто сохранить ваши объекты в массиве со всеми возможными значениями ushort. Массив длиной 65535 невелик в современных условиях. Поиск в массиве выполняется так быстро, как вы можете.

1 голос
/ 13 августа 2011

Лучшим выстрелом для вас будет база данных. SQLite очень переносим и не требует установки в системе.

Если вы загрузили все данные в память, вы можете использовать Dictionary<int, Item>.Это позволяет очень легко добавлять и удалять элементы в списке.

Поскольку кажется, что все ваши идентификаторы идут от 0 и выше, это было бы очень быстро при использовании только массива.Просто установите индекс элемента в качестве идентификатора.

0 голосов
/ 13 августа 2011

Вы можете использовать Dictionary или, если это используется в многопоточном приложении, тогда ConcurrentDictionary.

Чрезвычайно быстро, но немного больше усилий для реализации - MemoryMappedFile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...