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


大家好,本文介紹我們為什么使用函數式反應式編程來開發引擎,以及它在引擎中的相關的知識點。

上一篇博文

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

下一篇博文

從0開發3D引擎(七):學習Reason語言

介紹函數式反應式編程

函數式反應式編程又稱為“函數式響應型編程”,英文縮寫為“FRP”。
它的總體思想是一切都是流:可以把事件封裝為流,也可以把Promise封裝為流,還可以把集合(如數組、list等)封裝為流。可以用 merge、concat、map等operater對流進行函數式操作。
本質上,FRP是把時間線上的數據建模為流,即:

流 = 時間 + 數據

我們在對流進行一系列操作后,最后會subscribe該流,處理流的三個事件:next、error、complete。
舉例來說:
我們把數組[|1,2,3|](在Reason中,數組的語法是“[||]”,list的語法是“[]”)封裝為流並subscribe,則該流會依次觸發3次next事件,值分別為:1、2、3;在最后一次next事件觸發后,會觸發complete事件,完成該流;該流不會觸發error事件,因為沒有錯誤發生。

函數式反應式編程學習資料

該文通俗易懂,建議讀者通過該文來入門FRP。

該文舉了一個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引擎和編輯器(二):函數式編程准備


免責聲明!

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



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