相同的代码返回不同的结果

时间:2015-07-09 16:08:34

标签: c# windows unity3d

给出以下算法:

public static void Casteljau(Vector3 p1, Vector3 p2, Vector3 p3 , Vector3 p4, ArrayList L)
{
    float stepping = (float)(0.02);

    for (float x = 0.0f; x <= 1.0f; x += stepping)
    {
        Vector3 ap1 = Vector3.Lerp(p1, p2, x);
        Vector3 ap2 = Vector3.Lerp(p2, p3, x);
        Vector3 ap3 = Vector3.Lerp(p3, p4, x);

        Vector3  bp1 = Vector3.Lerp(ap1, ap2, x);
        Vector3  bp2 = Vector3.Lerp(ap2, ap3, x);

        Vector3  p = Vector3.Lerp(bp1, bp2, x);

        L.Add(p);
    }
}

得到四个点并返回表示它们之间曲线的点列表,并且给定传递给该函数的相同四个点,我得到不同的结果在两个不同的端点\ clients。其中一个计算点在运行之间有一点0.1f的偏差(差异非常小,但对我的使用至关重要)。

此算法用于多人游戏(使用Unity3D),并且两端运行此算法时具有完全相同四个点。

Vector的每个值都是浮点数,语言是C#,两端都在同一台PC上运行(一个客户端使用Unity编辑器运行,另一个客户端是使用Unity构建的可执行文件),操作系统在Windows

Lerp功能 - http://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

1 个答案:

答案 0 :(得分:0)

如果0.1准确度对你的眼睛很重要,那么使用双打可能是一个更好的主意,因为用浮子制作的每一个计算都会增加一些不精确性。在你的情况下,你处于一个使用浮动的for循环中,所以一些不精确可能会导致很大的差异。

有一个很好的stackOverflow答案: Floating point inaccuracy examples

建议将这些vector3包装成vector3的双重版本。至于exe和编辑器之间的区别,它可能是因为Exe和编辑器不是为同一个目标构建的。而且他们两个可用的资源都不一样。现在如果你在同一台PC上设法找到差异,你可能无法从不同的架构上的多台PC获得干净的结果。