ILRuntime學習(之四)

       第5個例子講解是重定向,原理按照官網的說法是:當IL解譯器發現需要調用某個指定CLR方法時,將實際調用重定向到另外一個方法進行挾持,再在這個方法中對ILRuntime的反射的用法進行處理。例如new方法就是不能直接用的,要進行重定向纔可以。例子中舉了Debug.Log這個情況,比如我們在DLL裏調用Debug.Log,默認情況下是無法顯示DLL內堆棧的,但是經過CLR重定向之後可以做到輸出DLL內堆棧。實際測試的情況,和這個例子講解的有出入,可能是例子不完整的緣故。經過我自己測試發現,有兩個問題例子沒有講明白,第一個就是,如果在重定向之前和之後調用同樣的Debug代碼,輸出堆棧是一樣的,重定向之後的堆棧信息並沒有更詳細。第二個情況就是,如果我註釋重定向之前的輸出,則,重定向之後的輸出會帶有更詳細的堆棧信息。

       AppDomain.RegisterCLRMethodRedirection(MethodBase mi, CLRRedirectionDelegate func)方法進行重定向的註冊,而func方法涉及到了指針,mi參數就是我們需要重定向的方法。

      第6個例子講解的是CLR綁定,使用這種綁定,可以產生更少的GC,按照教程的說法:默認情況下,從熱更DLL裏調用Unity主工程的方法,是通過反射的方式調用的,這個過程中會產生GC Alloc,並且執行效率會偏低。另外,例子中也指出:CLR綁定會生成較多C#代碼,最終會增大包體和Native Code的內存耗用,所以只添加常用類型和頻繁調用的接口即可。使用的方法很簡單:點擊Unity菜單裏面的ILRuntime->Generate CLR Binding Code來生成綁定代碼。前提是,需要生成綁定代碼的類預先寫在了ILRuntimeCLRBinding類中,生成的綁定代碼在"Assets/ILRuntime/Generated"文件夾中。通過自己的測試發現,感覺是沒有啥區別的。。。。下面是沒有綁定時的性能測試結果:

性能測試結果:

下面這張是綁定後的性能測試結果:

綁定後的性能測試結果:

可以看出來,基本沒有什麼區別。不清楚問題在哪兒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章