1

我想创建一个 Rectangle 结构,它byte的 x、y、宽度和高度字段为 s 而不是ints。它应该与通常的兼容Microsoft.Xna.Framework.Rectangle(铸造(bytesRectangle)应该可以)。我怎么做?

更新:使用这个结构帮助我为每个图块节省了 12 个字节。

4

2 回答 2

3

您必须定义一个转换来将您的类型转换为 XNA 框架所期望的类型。

见这里:http: //msdn.microsoft.com/en-us/library/09479473.aspx

于 2012-08-15T20:21:35.007 回答
2

我很想知道实现这个结构的设计选择。查看 Microsoft.Xna.Framework.Rectangle,我们看到有 30 多个属性和成员。为了节省几个字节,这需要大量重现。如果您唯一的目标是节省一些字节,那么可能有更好的方法。例如,如果您想将数据保存在更小的空间中,您可以定义一个对象和一个强制转换来存储它。像这样的东西:

class SmallRectangle
{
    public byte x { get; set; }
    public byte y { get; set; }

    public SmallRectangle(byte inx, byte iny)
    {
       x = inx;
       y = iny;
    }

    public static explicit operator SmallRectangle(Microsoft.Xna.Framework.Rectangle big)
    {
        SmallRectangle small = new SmallRectangle((byte)big.x, (byte)big.y);

        return small;
    }

    public WriteToFile(FileStream out)
    {
       //....
    }
}

当然,一个完整的实现将包括测试以确保铸造等没有数据丢失。

根据您在下面的评论:这不是前进的方向。如果您在使用 XNA 时确实需要通过 XNA 节省内存,那么您应该创建一个小矩形管理器类,它不会以相同的方式以相同的属性存储它们。但是这个类擅长在需要时创建 XNA 类。不要使小矩形类(或管理器)“兼容”。

在内存中存储所需数据的最佳方法是仅存储四个字节而没有开销。没有开销存储两个字节的最佳方法是使用 Tuple 类。

所以我建议你创建一个矩形管理器类,在内部将矩形存储为元组,然后根据需要将它们“装箱”和“拆箱”到 Xna 对象中。

于 2012-08-15T20:26:23.467 回答