2

OpenTK 通过首先定义一个与某个目标 C 函数具有匹配签名的委托来绑定到 OpenGL:

[System.Security.SuppressUnmanagedCodeSecurity()]
internal delegate void Uniform1f(Int32 location, Single v0);
internal static Uniform1f glUniform1f;

glUniform1f然后它为从平台特定的 OpenGLGetProcAddress函数返回的值分配一个值。

如果我不使用 OpenTK 的方法,而只是使用 DllImport 调用函数,我的代码会执行得更慢吗?(换句话说,使用委托是否有任何性能优势)。

4

1 回答 1

2

不,如果有的话,性能会受到影响(尽管在大多数情况下非常微不足道),因为您使用的是委托。

请记住,委托是对方法的引用。每次调用它时,都必须取消引用该引用。将此与编译到您的代码中的方法调用进行比较;当方法引用被烘焙到 IL 中时,运行时确切地知道它必须去哪里。

请注意,自 .NET 3.0 以来,委托性能已显着提高。随着 LINQ 的引入,委托将被大量使用,并且由于它们无处不在,它们必须很快。

您看到使用委托的一个可能原因是因为需要在运行时确定包含非托管代码的 DLL(可能是因为命名问题、特定于处理器的构建以不同的名称分布在一起等)。

在这种情况下,将调用非托管LoadLibraryWindows API 函数,然后调用非托管GetProcAddressWindows API 函数

一旦函数 poitner 被检索,它就会被传递给上的GetDelegateForFunctionPointer方法以获取委托。Marshal

于 2013-03-12T17:16:16.853 回答