目錄html
你們好,本文介紹咱們爲何使用函數式反應式編程來開發引擎,以及它在引擎中的相關的知識點。react
從0開發3D引擎(七):學習Reason語言github
函數式反應式編程又稱爲「函數式響應型編程」,英文縮寫爲「FRP」。
它的整體思想是一切都是流:能夠把事件封裝爲流,也能夠把Promise封裝爲流,還能夠把集合(如數組、list等)封裝爲流。能夠用 merge、concat、map等operater對流進行函數式操做。
本質上,FRP是把時間線上的數據建模爲流,即:編程
流 = 時間 + 數據
咱們在對流進行一系列操做後,最後會subscribe該流,處理流的三個事件:next、error、complete。
舉例來講:
咱們把數組[|1,2,3|](在Reason中,數組的語法是「[||]」,list的語法是「[]」)封裝爲流並subscribe,則該流會依次觸發3次next事件,值分別爲:一、二、3;在最後一次next事件觸發後,會觸發complete事件,完成該流;該流不會觸發error事件,由於沒有錯誤發生。數組
該文通俗易懂,建議讀者經過該文來入門FRP。app
該文舉了一個FRP的例子,並比較了「FRP」和「回調函數callback」這兩種處理異步的方式。該文適合讀者進一步學習FRP。異步
讀者能夠經過該問題的討論,瞭解爲何要用FRP。編輯器
FRP以流爲單位,封裝了時間序列和具體的數據,隱藏了「狀態的同步」、「異步邏輯的具體實現」等底層細節。函數式編程
可以使用組合,像管道處理同樣處理各類流,符合函數式編程的思惟。
我當時用了1個月學習FRP,並模仿Rxjs,使用Typescript寫了一個FRP庫:Wonder-FRP。
掌握FRP確實不容易,但一旦掌握,異步處理就會變得很是容易和健壯,值得咱們學習它!
除了用「FRP」處理異步,還能夠用:
1)回調函數
過多的回調會致使嵌套層次太深,容易陷入回調地獄,不易維護。
2)await,aync
經過這兩個關鍵字,把全部異步操做變爲同步操做。
這樣雖然簡化了邏輯,可是損失了異步帶來的性能優點(如把兩個並行操做變爲兩個串性操做,增長了時間開銷)
要在Javascript中使用FRP,有兩個庫能夠選擇:
爲了更高的性能,本系列使用most庫來開發引擎,並封裝了它的FFI。
引擎使用函數反應式編程來處理異步。
FRP的流來自於:
Promise
如將「加載圖片」封裝爲Promise,再用most.fromPromise將其轉換爲流。
Dom事件
如對於「鼠標click」事件,使用most.fromEvent將其轉換爲流。
集合
使用most.from將集合(如數組或者list)轉換爲流。
FRP的應用場景包括:
1)處理事件
2)處理多個線程的執行順序
3)讀寫資源