2013-03-12 49 views
2

OpenTK確實綁定到OpenGL的通過首先定義一個委託具有匹配簽名的一些目標C功能:在委託中存儲平臺調用的性能優勢?

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

然後將其分配給glUniform1f一個值,該值是從一個平臺特定的OpenGL GetProcAddress函數返回。

如果我不使用OpenTK的方法,而只是使用DllImport來調用函數,我的代碼執行速度會更慢嗎? (換句話說,使用代表是否有任何性能優勢)。

回答

2

不,如果有的話,會有一個性能命中(雖然在大多數情況下令人難以置信的微不足道),因爲您使用的是委託。

請記住,委託是對方法的引用。每次調用時,該參考必須爲,參見。將它與編譯到代碼中的方法調用進行比較;運行時知道確切的位置,因爲方法引用已被烘焙到IL中。

請注意,自.NET 3.0以來,代表性能已顯着提高。隨着LINQ的推出,代表們將被大量使用,並且隨着它們的普及,他們的有很快的速度。

您看到代表正在使用的一個可能的原因是因爲包含非託管代碼的DLL需要在運行時確定(可能是因爲命名問題,處理器特定的構建以不同名稱分佈在一起等)。

在這種情況下,將調用非託管LoadLibrary Windows API function,然後調用非託管GetProcAddress Windows API function

一旦函數poitner被取回,它將被傳遞給Marshal class上的GetDelegateForFunctionPointer method以獲取委託。