这个行动真的能避免SOH问题吗?

问题描述 投票:0回答:1

我正在使用渲染器程序学习 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);
}

谢谢。

c#
1个回答
0
投票

我的问题是,通过对所有对象使用 ref 真的可以解决问题吗?或者我只是愚弄编译器/插件?

别傻了,“解决”(或者更确切地说,改进)您的问题是您不再调用每次分配新对象的用户定义运算符,而是您自己进行数学计算。事实上,如果你从“可怕”的函数中删除

ref
,你会得到完全相同的结果,在内存方面(并且启动性能提升)。

要真正解决您的问题,您需要停止滥用引用类型并使用值类型来处理

V3
。如果它是一个向量,那么不要自己滚动,使用内置的
Vector3
。你绝对无法达到其性能的 10%,尤其是使用这样的代码。

© www.soinside.com 2019 - 2024. All rights reserved.