【发布时间】:2011-10-26 10:56:49
【问题描述】:
在我一直在开发的一款游戏中,我创建了一个系统,游戏通过该系统轮询特定的“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”方法的效率所做的研究,这种技术的速度几乎不足以融入游戏中。所以,我的问题是:有什么好的方法可以维护一个将识别号与可以快速访问的信息相关联的列表?
【问题讨论】:
-
有什么原因不能将整个文件加载到内存中的数组中吗?如果确实需要,操作系统将负责将内存分页到磁盘。一旦它进入一个数组,就可以快速轻松地处理每个项目。
-
随着游戏开发的继续,可能会有非常大的项目列表。比如说,如果列表达到 3000 个左右的独特项目,会不会对记忆造成负担?我只是想确保我不会在 RAM 中加载太多,同时仍然尽可能快地加载项目。
-
在现代 PC 上,每个 162 字节的 3,000 个项目都不算什么。那只有 486,000 字节。在过去,您可能会遇到麻烦,当时您的内存空间必须大大小于 640K,但您使用的是 C# 和托管代码(并且运行时占用的空间远远超过 640K)。在达到数百 MB 之前,您真的不需要担心。
-
那么,如果我完全填满了项目列表(每个项目 162 字节,最多 65536 个项目,所以大约 10 MB),我仍然是清楚的吗?非常感谢您的帮助!
标签: c# database database-design