大家好,本文介绍我们为什么使用函数式反应式编程来开发引擎,以及它在引擎中的相关的知识点。

上一篇博文

从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引擎和编辑器(二):函数式编程准备

从0开发3D引擎(六):函数式反应式编程及其在引擎中的应用的更多相关文章

  1. 从0开发3D引擎(五):函数式编程及其在引擎中的应用

    目录 上一篇博文 函数式编程的优点与缺点 优点 缺点 为什么使用Reason语言 函数式编程学习资料 引擎中相关的函数式编程知识点 数据 不可变数据 可变数据 函数 纯函数 高阶函数 柯西化 参考资料 ...

  2. 从0开发3D引擎(七):学习Reason语言

    目录 上一篇博文 介绍Reason Reason的优势 如何学习Reason? 介绍Reason的部分知识点 大家好,本文介绍Reason语言以及学习Reason的方法. 上一篇博文 从0开发3D引擎 ...

  3. 从0开发3D引擎:目录

    介绍 大家好,本系列带你踏上Web 3D编程之旅- 本系列是实战类型,从0开始带领读者写出"良好架构.良好扩展性.优秀的性能.最小功能集合(MVP)" 的3D引擎. 本系列的素材来 ...

  4. 用函数式编程,从0开发3D引擎和编辑器(一)

    介绍 大家好,欢迎你踏上3D编程之旅- 本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程,探讨了在从0开始构建3D引擎和编辑器的过程中,每一个重要的功能点.设计方 ...

  5. 用函数式编程,从0开发3D引擎和编辑器(三):初步需求分析

    大家好,本文介绍了Wonder的高层需求和本系列对应的具体功能点. 确定Wonder高层需求 业务目标 Wonder是web端3D开发的解决方案,包括引擎.编辑器,致力于打造开放.分享.互助的生态. ...

  6. 用函数式编程,从0开发3D引擎和编辑器(二):函数式编程准备

    大家好,本文介绍了本系列涉及到的函数式编程的主要知识点,为正式开发做好了准备. 函数式编程的优点 1.粒度小 相比面向对象编程以类为单位,函数式编程以函数为单位,粒度更小. 正所谓: 我只想要一个香蕉 ...

  7. 从0开发3D引擎(一):开篇

    介绍 大家好,本系列带你踏上Web 3D编程之旅- 本系列是实战类型,从0开始带领读者写出"良好架构.良好扩展性.最小功能集合(MVP)" 的3D引擎. 本系列的素材来自我们的产品 ...

  8. 从0开发3D引擎(四):搭建测试环境

    目录 上一篇博文 了解自动化测试 单元测试 集成测试 端对端测试 通过打印日志来调试 了解运行测试 断点调试 通过Spector.js测试WebGL 通过log调试Shader 移动端测试 了解性能测 ...

  9. 从0开发3D引擎(八):准备“搭建引擎雏形”

    大家好,现在开始本系列的第三部分,按照以下几个步骤来搭建引擎雏形: 1.分析引擎的需求 2.实现最小的3D程序 3.从中提炼引擎原型 4.一步一步地对引擎进行改进,使其具备良好的架构 5.实现与架构相 ...

随机推荐

  1. Python--day66--模板语言之自定义mysimpletag

  2. iptables一个包过滤防火墙实例

    环境:redhat9 加载了string time等模块 eth0 接外网──ppp0 eth1 接内网──192.168.0.0/24 #!/bin/sh # modprobe ipt_MASQUE ...

  3. Django OMR QuerySet的特性/存在意义

    QuerySet存在的意义主要在惰性机制和缓存两点 ---------->惰性机制: 所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个Quer ...

  4. Python--day63--添加书籍

    添加书籍的代码:

  5. java声明异常(throws)

    在可能出现异常的方法上声明抛出可能出现异常的类型: 声明的时候尽可能声明具体的异常,方便更好的处理. 当前方法不知道如何处理这种异常,可将该异常交给上一级调用者来处理(非RuntimeExceptio ...

  6. P1081 弹珠游戏

    题目出处 灵灵和他的小伙伴聪聪发掘了一个骨灰级别的游戏--超级弹珠. 游戏的内容是:在一个 n*n 的矩阵里,有若干个敌人,你的弹珠可以摧毁敌人,但只能攻击你所在的行.列里的所有敌人,然后你就可以获得 ...

  7. Eclipse修改编码字体

    步骤:Window-->Preference-->General-->Appearance-->Colors and Fonts-->java-->java Edi ...

  8. C# 在基类定义好方法让子类继承接口就能实现

    在 C# 里面,接口的定义只需要类里面存在和接口声明相同的方法或属性就可以,而存在的方法或属性是在子类定义的还是基类里面定义的都无所谓.也就是在基类里面写好了方法,但不继承接口,等子类继承接口的时候就 ...

  9. css页面去除滚动条

    注:滚动条是导致页面切换标签页闪动的原因 html{ /*隐藏滚动条,当IE下溢出,仍然可以滚动*/ -ms-overflow-style:none; /*火狐下隐藏滚动条*/ overflow:-m ...

  10. I/O 端口和 I/O 内存

    每个外设都是通过读写它的寄存器来控制. 大部分时间一个设备有几个寄存器, 并且在连 续地址存取它们, 或者在内存地址空间或者在 I/O 地址空间. 在硬件级别上, 内存区和 I/O 区域没有概念上的区 ...