我试图在我的游戏中实现 OpenSimplex Noise https://gist.github.com/digitalshadow/134a3a02b67cecd72181,但我收到错误“‘MethodImplOptions’不包含‘AggressiveInlining’的定义”。

[ MethodImpl(MethodImplOptions.AggressiveInlining)]
    private static int FastFloor(double x)
    {
        var xi = (int)x;
        return x < xi ? xi - 1 : xi;
    }

是的,我包含了 using System.Runtime.CompilerServices; 。现在,老实说,我不知道内联是如何工作的,所以我什至不知道 Unity 中的程序是否有必要这样做。如果我不需要它,我想知道用什么代替。提前致谢。

最佳答案

MethodImplOptions.AggressiveInlining 枚举不存在,因为此功能是在 .NET 4.5 中添加的,而 Unity 仍在使用 .NET 2.0/3.5。



这不是必需的,但它似乎加快了函数调用的速度。您可以看到速度测试 here



您可以使用 [MethodImpl(256)] 而不是 MethodImplOptions.AggressiveInlining 。这也应该有效。



查看下面 MethodImplOptions 枚举的源代码:

public enum MethodImplOptions {
        Unmanaged = 4,
        ForwardRef = 16,
        InternalCall = 4096,
        Synchronized = 32,
        NoInlining = 8,
        PreserveSig = 128,
        NoOptimization = 64,
#if NET_4_5
        AggressiveInlining  = 256,
#endif
    } // MethodImplOptions

如您所见, AggressiveInlining 的值为 256 。当您将 MethodImplAttribute 构造重载与 int 参数一起使用时,您基本上可以使用任何不存在的 enum 值。传递 256 应该会在任何 .NET 版本上为您提供 AggressiveInlining。新的枚举值只是为了更容易记住/使用。

另一个 source 来自 Unity Engineer:

关于c# - AggressiveInlining 不存在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43060376/

10-11 02:10