【问题标题】:Can I use the same Vector2 struct across multiple librarys that implement their own Vector2 structs?我可以在多个实现自己的 Vector2 结构的库中使用相同的 Vector2 结构吗?
【发布时间】:2020-09-15 17:46:52
【问题描述】:

我正在制作一款 2D 游戏,它将使用一个库将图形渲染到屏幕上,而另一个库用于物理。问题是这两个库都实现了自己的 Vector2 结构。这意味着我必须经常在两者之间进行转换,并且可能会混淆我指的是哪个 Vector2,因为它们都称为“Vector2”。理想情况下,我想在两个库中使用相同的 Vector2 类。如何使用 C# 实现这一点?

【问题讨论】:

  • @stuartd 我不完全确定我理解你的意思。如果我在共享库中实现自己的 Vector2 结构,我将无法将它的实例传递给物理库中的函数,因为物理库函数期望参数类型是 Vector2 的实现,而不是共享库中的那个。
  • @stuartd 我很确定 OP 意味着他们正在使用第三方库进行图形和物理;他们可能无法修改这些库以引用通用库和矢量类型。
  • @Romen 我想是的,我没有想到 3rd 方库。

标签: c# .net game-engine game-physics monogame


【解决方案1】:

您可以编写自己的支持implicit conversionMyVector2 结构到其他Vector2 类型。

struct MyVector2
{
    public float x;
    public float y;

    public static implicit operator GraphicsLib.Vector2(MyVector2 v)
    { return new GraphicsLib.Vector2(v.x,v.y); }

    public static implicit operator PhysicsLib.Vector2(MyVector2 v)
    { return new PhysicsLib.Vector2(v.x,v.y); }

    ...
}

那么MyVector2 的实例应该与任何期望来自任一库的Vector2 的函数兼容。

MyVector2 v = new MyVector2(5f, 20f);
GraphicsLib.DoSomethingWithVector(v);
PhysicsLib.DoSomethingWithVector(v);

如果优化至关重要,提到使用System.Runtime.CompilerServices.Unsafe.As<MyVector2, PhysicsLib.Vector2>(ref v); 的另一个答案也可以在转换运算符中使用。

【讨论】:

    【解决方案2】:

    如果它们具有相同的内部布局,您可以使用System.Runtime.CompilerServices.Unsafe 在它们之间进行转换。您还可以为每种类型创建扩展方法。例如。 public static Lib1.Vector2 ToLib1(this Lib2.Vector2 v) = > System.Runtime.CompilerServices.Unsafe.As<Lib2.Vector2, Lib1.Vector2>(ref v); 就个人而言,我使用 MonoGame,但尽可能使用 System.Numerics.Vector2 来支持 SIMD(这可能是不必要的微优化,但知道我可以使用 SIMD 指令时我会睡得更好)。

    【讨论】:

      猜你喜欢
      • 2018-02-20
      • 2020-11-25
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2017-10-16
      相关资源
      最近更新 更多