AggressiveInlining不存在

时间:2017-03-28 03:54:10

标签: c# unity3d

我试图在我的游戏中实现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中的程序是否必要。如果我不需要它,我想知道要使用什么。提前谢谢。

1 个答案:

答案 0 :(得分:10)

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

  

我甚至不知道Unity中的程序是否有必要

没有必要,但它似乎加快了功能调用。您可以看到速度测试here

  

我想知道要使用什么

您可以使用[MethodImpl(256)]代替MethodImplOptions.AggressiveInlining。这也应该有用。

  

Why do you think it should work? I'm curious about that. Any sources?

查看以下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工程师:

  

Little .NET提示:使用[MethodImpl(256)]代替   MethodImplOptions.AggressiveInlining在任何.NET版本上编译   并避免使用ifdefs