C# XNA矢量2的宽度和高度

C# XNA矢量2的宽度和高度,c#,xna,C#,Xna,我使用XNA,我经常做的一件事就是将数据作为矢量2传递。现在,XNA中的许多对象(例如图形设备等)都提供了单独的宽度和高度方法,而不是包含告诉您视口大小的矢量2。有没有什么方法可以向它们添加Vector2属性,这样我就可以在每次需要时不必手动构建新的Vector2就可以获得这些数据?我想我想要的是类似于“扩展属性”的东西……扩展属性不受支持,但您仍然可以编写扩展方法: class ExtensionMethods { public static Vector2 GetViewSize(t

我使用XNA,我经常做的一件事就是将数据作为矢量2传递。现在,XNA中的许多对象(例如图形设备等)都提供了单独的宽度和高度方法,而不是包含告诉您视口大小的矢量2。有没有什么方法可以向它们添加Vector2属性,这样我就可以在每次需要时不必手动构建新的Vector2就可以获得这些数据?我想我想要的是类似于“扩展属性”的东西……扩展属性不受支持,但您仍然可以编写扩展方法:

class ExtensionMethods
{
    public static Vector2 GetViewSize(this GraphicsDevice device)
    {
        return new Vector2(device.Viewport.Width, device.Viewport.Height);
    }
}

不支持扩展属性,但仍可以编写扩展方法:

class ExtensionMethods
{
    public static Vector2 GetViewSize(this GraphicsDevice device)
    {
        return new Vector2(device.Viewport.Width, device.Viewport.Height);
    }
}

您可以使用Michael的方法,但实际上每次都会构建一个新的矢量2。如果确实只希望创建一次Vector2,则可以包装所需的类,并提供自己的Vector2属性:

public class GraphicsDeviceWrapper
{
   private Vector2 vector;
   public GraphicsDeviceWrapper(GraphicsDevice device)
   {
      this.vector = new Vector2(device.Viewport.Width, device.Viewport.Height);
      this.Device = device;
   }

   public Vector2 Vector
   {
      get{return this.vector;}
   }

   public GraphicsDevice Device
   { 
      get; private set
   }
}

您可以使用Michael的方法,但实际上每次都会构建一个新的矢量2。如果确实只希望创建一次Vector2,则可以包装所需的类,并提供自己的Vector2属性:

public class GraphicsDeviceWrapper
{
   private Vector2 vector;
   public GraphicsDeviceWrapper(GraphicsDevice device)
   {
      this.vector = new Vector2(device.Viewport.Width, device.Viewport.Height);
      this.Device = device;
   }

   public Vector2 Vector
   {
      get{return this.vector;}
   }

   public GraphicsDevice Device
   { 
      get; private set
   }
}

Vector2是一种值类型。。。老实说,您不必太担心创建新实例,因为它们是在堆栈上创建的。每次可以使用.Vector属性时,它都会生成一个新实例

不过,您不必担心它,因为值类型不会调用垃圾收集器。因此,尝试实例化一次的最大原因是无效(即GC)


如所述,对于较大的结构,例如矩阵,您可能需要考虑通过ReF传递它们以避免堆栈上的新分配。

VECURT2是一个值类型…老实说,您不必太担心创建新实例,因为它们是在堆栈上创建的。每次可以使用.Vector属性时,它都会生成一个新实例

不过,您不必担心它,因为值类型不会调用垃圾收集器。因此,尝试实例化一次的最大原因是无效(即GC)


如所述,对于更大的结构,例如矩阵,您可能想考虑通过Ref传递它们以避免堆栈上的新分配。

< P>在效率方面,最好使用宽度和高度属性来尽可能地做任何需要的事情。但是,不要忘记优化的#1规则:

包装类的想法是一个很好的解决方案,但我只是想把全局可转换结构的想法抛在脑后。我使用这样的方法来消除对向量->点和点->向量转换的担忧(至少在调试期间):


这种结构,加上Vector2和Point之间的一些二进制运算符,使得Xna中的向量/点内容简单得多,但它也会导致模糊、舍入错误、截断损失以及与数值转换相关的所有其他有趣问题。所有这些问题都可以通过显式强制转换轻松解决,但请注意,如果您在使用此结构时看到“奇怪的数字”,可能是由于转换过程中的精度损失造成的。

就效率而言,最好只使用“宽度”和“高度”属性,在任何可能的地方执行任何需要的操作。但是,不要忘记优化的#1规则:

包装类的想法是一个很好的解决方案,但我只是想把全局可转换结构的想法抛在脑后。我使用这样的方法来消除对向量->点和点->向量转换的担忧(至少在调试期间):


这种结构,加上Vector2和Point之间的一些二进制运算符,使得Xna中的向量/点内容简单得多,但它也会导致模糊、舍入错误、截断损失以及与数值转换相关的所有其他有趣问题。所有这些问题都可以通过显式强制转换轻松解决,但请注意,如果在使用此结构时看到“奇怪的数字”,这可能是由于转换过程中的精度损失。

我认为我实际上将从GraphicsDevice派生,以提供我所需的扩展,这样我的代码就可以使用我编写的奇特插件,但任何使用常规图形设备的东西仍然可以工作。由于这个答案激发了这个想法,但它仍然是公认的答案。谢谢我不确定GraphicsDevice是否被密封(出于某种原因,我假设它是密封的),这就是为什么我提供了一个“包装器”解决方案。我想我实际上会从GraphicsDevice派生来提供我需要的扩展,这样我的代码就可以使用我编写的奇特的插件,但任何使用常规图形设备的东西仍然可以工作。由于这个答案激发了这个想法,但它仍然是公认的答案。谢谢我不确定GraphicsDevice是否被密封(出于某种原因,我假设它是密封的),这就是为什么我提供了一个“包装器”解决方案。我使用新向量的主要问题是它比仅使用变量长2到3倍。“在堆栈上创建”这是不正确的是@lukas,我在eric的博客文章发表之前写了这个回复。但至少部分是正确的;-)我使用新向量的主要问题是,它比仅仅使用变量长2到3倍。“在堆栈上创建”这是不正确的是的@lukas,我在eric的博客文章发表之前写了这个回复。但至少部分是正确的;-)