我正在使用渲染器程序学习 C#。
V3 _pixel00 = ...; //V3 is a Vector class
V3 _stepU = ...;
V3 _stepV = ...;
double x, y = ...;
...
var pointOnScreen = _pixel00 + _stepU * (x + sS.X) + _stepV * (y + sS.Y);
当我运行代码时,VS 在最后一行告诉我,
5,000 MB allocated in SOH, 4 issues.
所以我写了以下奇怪的函数:
public static V3 HorribleFunction(ref V3 a, ref V3 b, ref V3 c, double rateA, double rateB, double rateC)
{
return new V3(a.X * rateA + b.X * rateB + c.X * rateC,
a.Y * rateA + b.Y * rateB + c.Y * rateC,
a.Z * rateA + b.Z * rateB + c.Z * rateC);
}
var pointOnScreen = HorribleFunction(ref _pixel00, ref _stepU, ref _stepV, 1, x + sS.X, y + sS.Y);
然后警告就消失了。我的问题是,通过在所有对象上使用
ref
真的可以解决问题吗?或者我只是愚弄编译器/插件?
更新
这是
operator
s的代码。
public static V3 operator +(V3 a, V3 b)
{
return new (a.X + b.X, a.Y + b.Y, a.Z + b.Z);
}
public static V3 operator *(V3 a, double b)
{
return new V3(a.X * b,a.Y * b, a.Z * b);
}
谢谢。
我的问题是,通过对所有对象使用 ref 真的可以解决问题吗?或者我只是愚弄编译器/插件?
别傻了,“解决”(或者更确切地说,改进)您的问题是您不再调用每次分配新对象的用户定义运算符,而是您自己进行数学计算。事实上,如果你从“可怕”的函数中删除
ref
,你会得到完全相同的结果,在内存方面(并且启动性能提升)。
要真正解决您的问题,您需要停止滥用引用类型并使用值类型来处理
V3
。如果它是一个向量,那么不要自己滚动,使用内置的 Vector3
。你绝对无法达到其性能的 10%,尤其是使用这样的代码。