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

瘋光無線發表於2015-01-17

熱更新

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

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

之前,我設計了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 或者原生程式碼的引入

相關文章