OpenTK通过首先定义一个具有与某个目标C函数匹配的签名的委托来对OpenGL进行绑定:
[System.Security.SuppressUnmanagedCodeSecurity()]
internal delegate void Uniform1f(Int32 location, Single v0);
internal static Uniform1f glUniform1f;
然后它为从特定于平台的OpenGL glUniform1f
函数返回的GetProcAddress
赋值。
如果我不使用OpenTK的方法,而只是使用DllImport来调用该函数,我的代码会执行得更慢吗? (换句话说,使用代表是否有任何性能优势)。
答案 0 :(得分:2)
不,如果有的话,会有一个性能点击(虽然在大多数情况下非常微不足道),因为你正在使用一个代表。
请记住,委托是对方法的引用。每次调用时,该引用都必须 derefrenced 。将此与编译到代码中的方法调用进行比较;当方法引用被烘焙到IL中时,运行时确切地知道它必须去哪里。
请注意,自.NET 3.0以来,委托性能已显着提高 。随着LINQ的引入,代表们将被大量使用,并且无处不在,他们 要快。
您看到代理被使用的一个可能原因是因为包含非托管代码的DLL需要在运行时确定(可能是因为命名问题,特定于处理器的构建以不同的名称分布在一起等)。
在这种情况下,系统会调用非托管LoadLibrary
Windows API function,然后调用非托管GetProcAddress
Windows API function。
一旦检索到函数poitner,它就会被传递到GetDelegateForFunctionPointer
method上的Marshal
class以获得代理。