从0开发3D引擎(六):函数式反应式编程及其在引擎中的应用
大家好,本文介绍我们为什么使用函数式反应式编程来开发引擎,以及它在引擎中的相关的知识点。
上一篇博文
下一篇博文
介绍函数式反应式编程
函数式反应式编程又称为“函数式响应型编程”,英文缩写为“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,有两个库可以选择:
为了更高的性能,本系列使用most库来开发引擎,并封装了它的FFI。
引擎中相关的函数式反应式编程知识点
引擎使用函数反应式编程来处理异步。
FRP的流来自于:
-
Promise
如将“加载图片”封装为Promise,再用most.fromPromise将其转换为流。 -
Dom事件
如对于“鼠标click”事件,使用most.fromEvent将其转换为流。 -
集合
使用most.from将集合(如数组或者list)转换为流。
FRP的应用场景包括:
1)处理事件
2)处理多个线程的执行顺序
3)读写资源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?