我可以在实现自己的 Vector2 结构的多个库中使用相同的 Vector2 结构吗?
Can I use the same Vector2 struct across multiple librarys that implement their own Vector2 structs?
我正在制作一款 2D 游戏,它将使用一个库将图形渲染到屏幕上,另一个库用于物理。问题是两个库都实现了自己的 Vector2 结构。这意味着我必须经常在两者之间进行转换,这可能会混淆我指的是哪个 Vector2,因为它们都被称为“Vector2”。理想情况下,我想在两个库中使用相同的 Vector2 class。我如何使用 C# 实现此目的?
如果它们具有相同的内部布局,您可以使用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 支持(这可能是不必要的 micro-optimization 但我睡得更好,因为我知道我会尽可能使用 SIMD 指令)。
您可以编写自己的 MyVector2
结构,支持 implicit conversion 到其他 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);
的另一个答案也可以在转换运算符内部使用。
我正在制作一款 2D 游戏,它将使用一个库将图形渲染到屏幕上,另一个库用于物理。问题是两个库都实现了自己的 Vector2 结构。这意味着我必须经常在两者之间进行转换,这可能会混淆我指的是哪个 Vector2,因为它们都被称为“Vector2”。理想情况下,我想在两个库中使用相同的 Vector2 class。我如何使用 C# 实现此目的?
如果它们具有相同的内部布局,您可以使用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 支持(这可能是不必要的 micro-optimization 但我睡得更好,因为我知道我会尽可能使用 SIMD 指令)。
您可以编写自己的 MyVector2
结构,支持 implicit conversion 到其他 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);
的另一个答案也可以在转换运算符内部使用。