熱更新
天下武功,無堅不破,唯快不破
熱更新就是為了更快的把內容推到使用者手中。
之前,我設計了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#存在很大的優化空間
- 還有很多階段有填Cache的空間
- 既然我們是模擬CLR的工作,對IL語句,自然也可以做出類似JIT的優化。
比如a.nop語句完全是浪費時間可以移除
b.stloc ldloc 這種兩條連續,引數一致的語句,他的意義是儲存變數並載入變數,我們就可以設計一條優化指令,stlocandstayinstack,儲存變數並且保留在棧上。
c.很多算術運算都是ld到棧,計算,再存回,只要設計優化的自增運算指令,就可以三條變一條
3.可以考慮 unsafe 或者原生程式碼的引入