【发布时间】:2013-12-18 07:26:54
【问题描述】:
我正在使用其他人的 .NET 4 开源平滑粒子流体动力学代码,我正在尝试将其转换为 Unity 项目,您只能指望它符合 .NET 2 标准。不幸的是,代码使用了 Parallels 类(太棒了!),但他使用了一种更晦涩难懂的重载。任何人都可以看到在 .NET 2 中实现相同目标而又不会对性能造成巨大影响的好方法吗?
Parallel.For(
0,
_numActiveParticles,
() => new Vector2[MAX_PARTICLES],
(i, state, accumulatedDelta) => calculateForce(_activeParticles[i], accumulatedDelta),
(accumulatedDelta) =>
{
lock (_calculateForcesLock)
{
for (int i = _numActiveParticles - 1; i >= 0; i--)
{
int index = _activeParticles[i];
_delta[index] += accumulatedDelta[index] / MULTIPLIER;
}
}
}
);
我认为这就是代码的作用(非线程):
for (int i = 0; i < _numActiveParticles; i++)
{
Vector2[] temp = new Vector2[MAX_PARTICLES];
temp = calculateForce(_activeParticles[i], temp);
for (int k = _numActiveParticles - 1; k >= 0; k--)
{
int index = _activeParticles[k];
_delta[index] += temp[index] / MULTIPLIER;
}
}
【问题讨论】:
-
您可能会觉得这很有帮助stackoverflow.com/q/12386686/809009
-
@OndrejJanacek 谢谢,这很有帮助,但我也不是 100% 确定 Parallels 版本在做什么,所以我想确保我翻译正确。
-
我不认为你的理解是正确的。您甚至没有在任何地方使用“temp”变量。阅读:msdn.microsoft.com/en-us/library/ff963547.aspx
-
我认为 unity 几乎是 3.5,虽然它说 2.0。这是一个相关链接answers.unity3d.com/questions/472726/…
-
如果您要在整个身体上使用
lock,那么使用Parallel.For有什么意义?您也可以使用普通的for。它的性能会更好,因为它不会有所有不必要的同步/线程开销。
标签: c# .net multithreading unity3d game-physics