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関数が呼び出され、続いてアンマネージWindowsAPI関数が呼び出されGetProcAddressます

関数poitnerが取得されると、デリゲートを取得するためにクラスのGetDelegateForFunctionPointerメソッドに渡されます。Marshal

于 2013-03-12T17:16:16.853 に答える