從0開發3D引擎(六):函數式反應式編程及其在引擎中的應用

你們好,本文介紹咱們爲何使用函數式反應式編程來開發引擎,以及它在引擎中的相關的知識點。react

上一篇博文

從0開發3D引擎(五):函數式編程及其在引擎中的應用git

下一篇博文

從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
經過這兩個關鍵字,把全部異步操做變爲同步操做。
這樣雖然簡化了邏輯,可是損失了異步帶來的性能優點(如把兩個並行操做變爲兩個串性操做,增長了時間開銷)

爲何使用Most庫

要在Javascript中使用FRP,有兩個庫能夠選擇:

  • RxJS
    該庫用的人不少,功能齊全。
  • most
    該庫性能更好,並且更輕量。雖然功能要少點,不過夠用,

爲了更高的性能,本系列使用most庫來開發引擎,並封裝了它的FFI

引擎中相關的函數式反應式編程知識點

引擎使用函數反應式編程來處理異步

FRP的流來自於:

  • Promise
    如將「加載圖片」封裝爲Promise,再用most.fromPromise將其轉換爲流。

  • Dom事件
    如對於「鼠標click」事件,使用most.fromEvent將其轉換爲流。

  • 集合
    使用most.from將集合(如數組或者list)轉換爲流。

FRP的應用場景包括:
1)處理事件
2)處理多個線程的執行順序
3)讀寫資源

參考資料

用函數式編程,從0開發3D引擎和編輯器(二):函數式編程準備

相關文章
相關標籤/搜索