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