从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)读写资源
参考资料
用函数式编程,从0开发3D引擎和编辑器(二):函数式编程准备
从0开发3D引擎(六):函数式反应式编程及其在引擎中的应用的更多相关文章
- 从0开发3D引擎(五):函数式编程及其在引擎中的应用
目录 上一篇博文 函数式编程的优点与缺点 优点 缺点 为什么使用Reason语言 函数式编程学习资料 引擎中相关的函数式编程知识点 数据 不可变数据 可变数据 函数 纯函数 高阶函数 柯西化 参考资料 ...
- 从0开发3D引擎(七):学习Reason语言
目录 上一篇博文 介绍Reason Reason的优势 如何学习Reason? 介绍Reason的部分知识点 大家好,本文介绍Reason语言以及学习Reason的方法. 上一篇博文 从0开发3D引擎 ...
- 从0开发3D引擎:目录
介绍 大家好,本系列带你踏上Web 3D编程之旅- 本系列是实战类型,从0开始带领读者写出"良好架构.良好扩展性.优秀的性能.最小功能集合(MVP)" 的3D引擎. 本系列的素材来 ...
- 用函数式编程,从0开发3D引擎和编辑器(一)
介绍 大家好,欢迎你踏上3D编程之旅- 本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程,探讨了在从0开始构建3D引擎和编辑器的过程中,每一个重要的功能点.设计方 ...
- 用函数式编程,从0开发3D引擎和编辑器(三):初步需求分析
大家好,本文介绍了Wonder的高层需求和本系列对应的具体功能点. 确定Wonder高层需求 业务目标 Wonder是web端3D开发的解决方案,包括引擎.编辑器,致力于打造开放.分享.互助的生态. ...
- 用函数式编程,从0开发3D引擎和编辑器(二):函数式编程准备
大家好,本文介绍了本系列涉及到的函数式编程的主要知识点,为正式开发做好了准备. 函数式编程的优点 1.粒度小 相比面向对象编程以类为单位,函数式编程以函数为单位,粒度更小. 正所谓: 我只想要一个香蕉 ...
- 从0开发3D引擎(一):开篇
介绍 大家好,本系列带你踏上Web 3D编程之旅- 本系列是实战类型,从0开始带领读者写出"良好架构.良好扩展性.最小功能集合(MVP)" 的3D引擎. 本系列的素材来自我们的产品 ...
- 从0开发3D引擎(四):搭建测试环境
目录 上一篇博文 了解自动化测试 单元测试 集成测试 端对端测试 通过打印日志来调试 了解运行测试 断点调试 通过Spector.js测试WebGL 通过log调试Shader 移动端测试 了解性能测 ...
- 从0开发3D引擎(八):准备“搭建引擎雏形”
大家好,现在开始本系列的第三部分,按照以下几个步骤来搭建引擎雏形: 1.分析引擎的需求 2.实现最小的3D程序 3.从中提炼引擎原型 4.一步一步地对引擎进行改进,使其具备良好的架构 5.实现与架构相 ...
随机推荐
- [kuangbin带你飞]专题九 连通图D - Network POJ - 3694
这道题其实也非常简单,只是在求割边及其个数的情况下,每次往里面加入新的边,并再次计算割边的个数. 我们用tarjan可以求出原图的桥以及个数,当然我们不能暴力加边,然后求解,那么如何求呢??? 其实非 ...
- jq实现简单购物车增删功能
https://www.cnblogs.com/sandraryan/ jq实现购物车功能 点击+- 增减数量,计算价格: 点击删除,删除当前行(商品) 点击- ,减到0 询问是否删除商品 点击全选 ...
- Fragment学习(一) :生命周期
一. 何为Fragment Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个Activity中来创建一个多面界面,并且你可以在多个Activity ...
- laravel .env 文件的使用
转载地址 http://www.cnblogs.com/Eden-cola/p/DotEnv-in-lumen.html umen 是 laravel 的衍生品,核心功能的使用和 laravel 都 ...
- pytorch BiLSTM+CRF代码详解 重点
一. BILSTM + CRF介绍 https://www.jianshu.com/p/97cb3b6db573 1.介绍 基于神经网络的方法,在命名实体识别任务中非常流行和普遍. 如果你不知道Bi- ...
- 通过作用域链解析js函数一些难以理解的的作用域问题
基本原理 js函数在执行时,系统会创建一个隐式的属性scope,scope中存储的是函数的作用域链. 通过对这个scope的分析,就能解释JavaScript中许多难以理解的问题: 例1: funct ...
- H3C ping命令的输出
- 字符串和While循环
字符串是以单引号或双引号括起来的任意文本 创建字符串 str1 = "shaoge is a good man!" 字符串运算 字符串连接 str6 = "shaoge ...
- MFC 任务托盘显示气泡
void CTestDlg::OnClose() { ShowWindow(SW_HIDE); if (!m_bHideNoticeInfo) { ShowBalloonTip(_T(, ); m_b ...
- Java 学习笔记(4)——java 常见类
上次提前说了java中的面向对象,主要是为了使用这些常见类做打算,毕竟Java中一切都是对象,要使用一些系统提供的功能必须得通过类对象调用方法.其实Java相比于C来说强大的另一个原因是Java中提供 ...