词典拳击

Dictionary Boxing

我正在使用 Microsoft XNA Game Studio 4.0 作为我项目的模板。

在这个项目中,我有一个用于所有实体、射弹等的基础 class,称为 Sprite

我计划使用单例来处理所有 Sprite,这样我就不必在每次需要时都创建一个新的 Sprite(如果以前使用过的话)。

这是首选,因为 Sprites 在其他字段中有一个 Texture2D 字段,如果创建了足够多的 Sprites,可能会占用内存。

这里是我的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 或任何其他方法也会产生成本。

简而言之,您必须执行基准测试才能真正找到问题的根源以进行微优化。但是,我认为存储为基本类型在我看来会很好。


其他资源