c#编程:快速维护ID与信息关联的列表
本文关键字:信息 关联 列表 ID 维护 编程 | 更新日期: 2023-09-27 18:05:23
在我一直致力于的一款游戏中,我创建了一个系统,通过该系统,游戏将轮询一个特定的"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();
}
通常情况下,这个系统不会有什么特别的问题,因为它查询所需的数据并将其初始化为正确的变量。然而,这个过程必须在游戏时间内进行,根据我对"Seek"方法的效率所做的研究,这种技术的速度还不够快,无法融入游戏中。因此,我的问题是:维护一个将标识号与可快速访问的信息相关联的列表的好方法是什么?
你最好是一个数据库。SQLite非常便携,不需要在系统上安装。
如果您已将所有数据加载到内存中,则可以使用Dictionary<int, Item>
。这使得在列表中添加和删除项目变得非常容易。
似乎你的id都是从0开始向上的,如果只是一个数组,它会非常快。只需将项目的索引设置为id。
假设"数据库"中的信息不会持续更改,那么你是否可以在游戏或关卡加载期间一次性读出各种道具?您可以以多种方式存储数据,例如Dictionary。. net Dictionary实际上通常被称为哈希表,将键(在本例中是您的ID字段)映射到对象(我猜是"Item"类型)。查找时间非常好(绝对是每秒百万次),我怀疑你永远不会有问题。
或者,如果你的ID是ushort,你可以把你的对象存储在一个包含所有可能的ushort值的数组中。一个65535长度的数组在今天看来并不算大。数组查找是尽可能快的
您可以使用Dictionary
,或者如果在多线程应用程序中使用ConcurrentDictionary
。
非常快,但在实现MemoryMappedFile
时需要更多的努力。