我正在为游戏开发模拟器。我有一个名为" Map"的对象,它包含地图的ID,以及有关它的其他各种信息。游戏包含很多地图对象(大约10,000个)。数据位于SQL表中,因此我使用它来加载它。
我有一个名为CachedMaps
的类,它继承自KeyedCollection
的int和map。标识符是地图的ID。不幸的是,加载所有地图大约需要5秒钟。
无论如何,并非所有地图都会被访问。我的朋友建议我使用"延迟加载",我不知道该怎么做 - 比如,只有当用户输入时才加载地图的数据或对象。这怎么可能?谢谢。
public class CachedMaps : KeyedCollection<int, Map>
{
public CachedMaps()
: base()
{
// The loading code.
// this.Add(new Map(....));
}
}
答案 0 :(得分:2)
您应该使用其目的正是如此的Lazy泛型类。
使用MSDN中的示例:(&#34;大对象&#34;将是您的地图):
lazyLargeObject = new Lazy<LargeObject>(() =>
{
LargeObject large = new LargeObject(Thread.CurrentThread.ManagedThreadId);
// Perform additional initialization here.
return large;
});
答案 1 :(得分:1)
我的想法,对你来说最好的方法如果你打电话给数据库加载一张地图,那将是一个物理上的懒惰负载(或者我称之为)。
这里的概念是,在第一次加载时,您只能获得用户选择地图所需的信息......您如何做到这一点取决于您......一个带有地图名称和ID的下拉列表...一个包含关联ID的小屏幕截图列表(我在这里思考游戏)。
然后,只有当用户选择地图后,才会从数据库中获取完整的地图信息。同样,既然你提到对象很大,我只会缓存&#34;选择地图&#34;的地图标识符列表。部分,而不是地图本身......对于这个简单的场景: 如果我正在测试你的东西,并运行最终场景,即加载所有地图,该怎么办?如果所有这些都被缓存,那么你将耗尽内存。
无论如何我会怎么做......
答案 2 :(得分:0)
只需创建一个包含Dictionary
的课程,而不是一个覆盖KeyedCollection
的课程:
public class CachedMaps
{
private readonly Dictionary<int, Map> _maps = new Dictionary<int, Map>();
public Map GetMap(int mapId)
{
if (!this._maps.ContainsKey(mapId))
{
this._maps[mapId] = this.Add(new Map(....));
}
return this._maps[mapId];
}
}
现在按需加载地图然后缓存。