在C#或C ++中进行向量math运算时,如何最小化内存抖动?

我使用Vector3D,Matrix4x4,Plane3D等典型类在游戏引擎循环中做了大量的3Dmath运算。目前,每个操作都会为结果值创建一个新的对象。 当GC启动时,创建的新对象的数量会导致一个口吃。

在这个简单的向量操作中,创建了两个新的Vector3D对象,一个用于分隔,一个用于乘法运算符。

// C# result = (v / len1) * len2; // where len* is a `double` 

我碰巧知道一些C ++,所以一个优化的版本会在堆栈上创建一个可丢弃的对象,并将其传递给各个操作,从而自动在函数结束时抛弃临时对象(也完全避免了GC)这个:

 // C++ Vector3D result; v.divideBy(len1, &result); result.multiplyBy(len2, &result); 

但是正如你所看到的那样繁琐而难以理解。 那么pro C ++ gamedev使用哪些常用的内存优化策略来优化向量math呢? 我正在寻找可以用C#和其他高级语言实现的通用平台不可知的解决scheme,尽管C ++内存技巧也是值得赞赏的。

你确定matrix操作导致放缓吗? 在C#中,大多数Vector库都将它们的types实现为结构,这些结构通常不是使用垃圾回收器分配的,而是在堆栈上创建的。 您示例中的临时对象不会导致需要收集的分配。

目前,每个操作都会为结果值创建一个新的对象。 当GC启动时,创建的新对象的数量会导致一个口吃。

确保你的mathtypes是值types( struct s); 值types不会创建垃圾(除非在参考types中装箱)。

如果你的mathtypes已经是数值types,那么使用一个分析器,因为你看到的GC结果并不是由你看起来假设的直接造成的。

我碰巧知道一些C ++,所以一个优化的版本会在堆栈上创建一个可丢弃的对象,并将其传递给各个操作,从而自动在函数结束时抛弃临时对象(也完全避免了GC)这个:

C#没有RAII,而且IDisposable模式用于处理非托管资源(或由于它们包含非托管资源而本身为IDisposable托管资源)。 将它用于mathtypes不会优化任何东西。