Unity3D邏輯熱更新,第二代舒爽解決方案,L#使用簡介


熱更新

天下武功,無堅不破,唯快不破

熱更新就是為了更快的把內容推到用戶手中。

之前,我設計了C#Light,經過半年多的持續修補,勉強可用,磕磕絆絆。
感謝那些,試過,罵過,用過的朋友,在你們的陪伴下一路走來,也讓我更堅定了要把這件事做好的決心。於是就有了C#Light的2.0,L#。

為什么叫L#呢?
因為這次是直接加載解析DLL執行,Load,有一個L
因為直接執行的東西叫做IL,有一個L
因為模擬CLR的工作,有一個L
於是,就有了L#

https://github.com/lightszero/LSharp

歡迎加QQ群223823428探討:

L#為什么舒爽

上一篇已經解釋了工作模式
你可以看到這一次變C#Light的"巧妙"利用VS、mono做語法檢查變成真的使用vs、mono來編譯
徹底的解決了C#Light語法支持不完整的問題
C#Light設計之初就確定了是c#的語法子集
編寫起來,限制諸多,處處掣肘,只保留了C#的形
這一次,L#,形神兼備。而且不止是c#,L#支持C# vb.net unityscript f# boo,只要能編譯成dotnet dll就可以

 

上一篇見這里http://www.cnblogs.com/crazylights/p/4216913.html

上一篇發布之后,L#的接口又做出了一些調整

Github 上有最新的源碼https://github.com/lightszero/LSharp
其中有一個ForUnity目錄,就是為Unity准備的
已經測試通過了IOS和WP8這兩個極端環境

L#在C#Light基礎上做出的改進

1.C#light的Context設計不明確

很多人都在疑惑何時該new,為何要new
L#徹底把這個設計修改為ThreadContext,腳本中的線程管理對象,在一個線程上只需要new一次,而且隨時ThreadContext.active 就可獲取。
以前C#Light 從回調中調用,就只能看到回調一部分腳本堆棧了。
L#修改了這個設計,一個線程上的腳本堆棧全是一體的,即使經過回調也完全可見,經過回調排錯不再困難

2.改動了接口結構

更像反射,方便在反射和L#腳本中快速切換
L#的接口結構和反射一致,而且可以直接使用L#的調用方式調用反射。
更添加了快速切換反射和L#腳本的模式,發生難以判斷的bug時,可以切到反射模式排查。
在支持反射的平台上,也可以切換到反射模式加速
快速切換的例子,有一個獨立測試程序,Test01

3.注冊改為可選

C#Light采用了先注冊再調用的模式,很多人抱怨不便。
這其實是C#Light設計上的先天困難。
而IL解析DLL執行,DLL中的信息很完整,所以IL默認可以自動完成所有的類型注冊
也依然保留手工注冊的接口。

4.L#的神器CrossBind

L#設計了一個CrossBind方式,允許腳本直接繼承程序中的接口

比如在程序中設計一個

Interface IState

{

void Abc();

}

腳本可以繼承此接口,並返回兼容IState的實例給程序

腳本中已經實現了關於迭代器的兩個CrossBind

也就是支持在腳本中使用yield語句。

L#的優化空間

很多人都關心L#的性能問題,L#的工作還沒推進到那個階段。

現在在Alpha階段,歡迎小白鼠加入,一起踩踩坑。

根據目前的少量用戶試用反饋,其Bug是比C#Light Alpha階段少了很多的。

但是L#存在很大的優化空間

  1. 還有很多階段有填Cache的空間
  2. 既然我們是模擬CLR的工作,對IL語句,自然也可以做出類似JIT的優化。

    比如a.nop語句完全是浪費時間可以移除

    b.stloc ldloc 這種兩條連續,參數一致的語句,他的意義是保存變量並加載變量,我們就可以設計一條優化指令,stlocandstayinstack,保存變量並且保留在棧上。

c.很多算術運算都是ld到棧,計算,再存回,只要設計優化的自增運算指令,就可以三條變一條

3.可以考慮 unsafe 或者本地代碼的引入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM