词典拳击
Dictionary Boxing
我正在使用 Microsoft XNA Game Studio 4.0 作为我项目的模板。
在这个项目中,我有一个用于所有实体、射弹等的基础 class,称为 Sprite
。
我计划使用单例来处理所有 Sprite
,这样我就不必在每次需要时都创建一个新的 Sprite
(如果以前使用过的话)。
这是首选,因为 Sprite
s 在其他字段中有一个 Texture2D
字段,如果创建了足够多的 Sprite
s,可能会占用内存。
这里是我的Texture2D
单例的一部分作为参考:
public static class TextureManager{
private static Dictionary<string, Texture2D> allTextures = new Dictionary<string, Texture2D>();
public static Texture2D GetTexture(string name){
if(allTextures.ContainsKey(name))
return allTextures[name];
... //Code to handle and create a new key is omitted for simplicity's sake
return newTexture; //The new texture created from the "name" key
}
}
与每次需要时从内容管道创建新的 Texture2D
相比,此单例更受欢迎。代码源自 this answer.
在规划 Sprite
单身人士时,我想到必须进行拳击才能让单身人士在一个 Dictionary
上工作,因为基本上我所有的实体和投射物 classes 将继承 Sprite
class.
问题:
boxing/unboxing 在一个 Dictionary
上比在每个类型的 Sprite
上有多个 Dictionary
更有效吗?
这不是拳击...
Boxing is the process of converting a value type to the type object or
to any interface type implemented by this value type. When the CLR
boxes a value type, it wraps the value inside a System.Object and
stores it on the managed heap. Unboxing extracts the value type from
the object. Boxing is implicit; unboxing is explicit. The concept of
boxing and unboxing underlies the C# unified view of the type system
in which a value of any type can be treated as an object.
值类型的值转换为引用类型时会发生装箱。将引用类型转换为其基类型是 not boxing/unboxing.
转换不是很昂贵,尽管它会产生成本,switch
语句、typeOf
或任何其他方法也会产生成本。
简而言之,您必须执行基准测试才能真正找到问题的根源以进行微优化。但是,我认为存储为基本类型在我看来会很好。
其他资源
我正在使用 Microsoft XNA Game Studio 4.0 作为我项目的模板。
在这个项目中,我有一个用于所有实体、射弹等的基础 class,称为 Sprite
。
我计划使用单例来处理所有 Sprite
,这样我就不必在每次需要时都创建一个新的 Sprite
(如果以前使用过的话)。
这是首选,因为 Sprite
s 在其他字段中有一个 Texture2D
字段,如果创建了足够多的 Sprite
s,可能会占用内存。
这里是我的Texture2D
单例的一部分作为参考:
public static class TextureManager{
private static Dictionary<string, Texture2D> allTextures = new Dictionary<string, Texture2D>();
public static Texture2D GetTexture(string name){
if(allTextures.ContainsKey(name))
return allTextures[name];
... //Code to handle and create a new key is omitted for simplicity's sake
return newTexture; //The new texture created from the "name" key
}
}
与每次需要时从内容管道创建新的 Texture2D
相比,此单例更受欢迎。代码源自 this answer.
在规划 Sprite
单身人士时,我想到必须进行拳击才能让单身人士在一个 Dictionary
上工作,因为基本上我所有的实体和投射物 classes 将继承 Sprite
class.
问题:
boxing/unboxing 在一个 Dictionary
上比在每个类型的 Sprite
上有多个 Dictionary
更有效吗?
这不是拳击...
Boxing is the process of converting a value type to the type object or to any interface type implemented by this value type. When the CLR boxes a value type, it wraps the value inside a System.Object and stores it on the managed heap. Unboxing extracts the value type from the object. Boxing is implicit; unboxing is explicit. The concept of boxing and unboxing underlies the C# unified view of the type system in which a value of any type can be treated as an object.
值类型的值转换为引用类型时会发生装箱。将引用类型转换为其基类型是 not boxing/unboxing.
转换不是很昂贵,尽管它会产生成本,switch
语句、typeOf
或任何其他方法也会产生成本。
简而言之,您必须执行基准测试才能真正找到问题的根源以进行微优化。但是,我认为存储为基本类型在我看来会很好。
其他资源