react 360消息传递原理解析

react vr中文网:www.vr-react.com

react vr qq群:481244084

示例源码 github:https://github.com/LiuC520/ReactVR/
早起react 360是叫react vr的,后来facebook改成了react 360,原来的好多东西包括原理和模块都重写了,原来介绍了react vr 消息传递原理,里面有些原理已经修改了。
现在我重新来倒着讲一下消息传递的原理,这次更浅显易懂些。

开发者头条:react vr 原理解析

开发者头条:React VR 视频源码解析

开发者头条:react vr 消息传递原理解析

首先举个例子,我想实现在react 一边发送消息,在html里面能接收到,举个例子,我要在html的入口文件中加个loading,然后在js解析完毕再关闭loading,来优化体验?

  1、首先我们需要在html中添加如下的代码:


loading html.png

也就是添加html5的loading div,并给了个旋转的动画,只要加载页面就显示loading。
接下来我们来如何让动画在加载了页面以后消失。
  2、在上面html中我们可以看到,先加载的是client的bundle文件,里面有一个init的方法,然后才是具体执行这个init初始化方法,传递的参数是index.bundle文件,还有要挂载的div,其他的一些配置(资源路径等等)。
这时间我们还按照上一篇文章里讲的worker来操作,因为这是搬运工,来回搬运数据的,也就相当于快递的中转站。
  寄件方(刘成)把快件给了快递员,快递员再打个包给收件方(刘成的女朋友)。同时收件方(刘成的女朋友)也可以成为寄件方,再把新的快件给快递员(刘成),快递员打个包再寄回去。
  不同的是,这个快递不一样,里面有好多小的商品,刘成给他的女朋友买了好多东西,有牙刷、有牙膏、手机、电脑、还有西瓜,这时间快递员就需要按照不同的类型把这些东西打包放好放到一个大箱子里面,这样才不会乱,要不然女朋友收到这么一堆乱七八糟的东西,直接就扔了分手了。
  开个玩笑,其实react 360的消息机制就是这样的,只不过react 360的工人跟原来的不一样了,原来是直接聘请了(new)一个工人(worker),
直接在client里面调用下面的方法就可以了,具体接收到的参数就放到onVRMessage方法里面来操作

vr.rootView.context.worker.addEventListener('message',onVRMessage);//接受消息的在react vr那边直接 postMessage({ type: "sceneLoadStart"})

function onVRMessage(e) {
switch (e.data.type) {
case 'sceneChanged':
if (window.playerCamera.zoom != 1) {
window.playerCamera.zoom = 1;
window.playerCamera.updateProjectionMatrix();
}
break;
case 'sceneLoadStart':
document.getElementById('loader').style.display = 'block';//设置html的div属性
break;
case 'sceneLoadEnd':
document.getElementById('loader').style.display = 'none';
break;
default:
return;
}
}
//-------------------------------接受消息-e-------------------------------

而现在react 360重构了以后,就好像新建一个工作站,搞了一块儿底盘,然后建立了工作室(Executor),工人都在工作室里面
原来的工人在conext上下文中可以直接取到,现在需要用下面的方法才能让loading消失。

client里面的方法如下图


WX20180528-234401@2x.png

  3、运行时

r360.runtime.executor._worker.addEventListener('message', onVRMessage);
现在的工人不在上下文中直接取了,
而是在运行时里面,你也可以自己传递一个executor到运行时里面,具体怎么搞,以后再给大家讲解,也就是你可以自定义传递的类型和方法。
这个runtime是干嘛的呢?他是react vr的主要逻辑了,他发送数据给executor,在内存中构建node节点,同时还告诉Compositor怎样渲染一切的东西。
有点儿像CEO的感觉,总管一切,executor就像team leader,这个leader把数据包装成blob,然后给工人去传递。
其他的暂时不讲,至于如何在内存中构建node节点,如何告诉Compositor去渲染,后面单独开文章再讲。

  4、worker
可以看到运行时里面新建了一个ReactExecutorWebWorker,这个工人类呢里面有几个方法,也就是team leader有几个方法,
  4.1、首先是构造方法,把需要的方法打包成一个Blob,里面有加载bundle的方法,有判断是不是dev(开发环境)的方法,有发送数据的方法,有接受数据的方法,接收数据的方法,在ReactExecutor.js里面。
然后新建一个工人,工人的onmessage(接受数据)方法里面会把接收到的消息放到消息队列中,自此构造方法结束
  4.2、moduleConfig,里面是原生的模块(IManager、AndroidConstants、AsyncLocalStorage、ControllerInfo、History、Networking、LinkingManager、Location、Timing、VideoModule、AudioModule、WebSocketModule、ReactVRConstants、RCTExceptionsManager、RCTSourceCode、ExternalAssets、GlyphTextures)
  4.3、setConstant 设置常数
  4.4、exec 这个是发送bundle
  4.5、call 执行方法,传递参数
  4.6、invoke 执行方法,传递参数,传递是是viewtag id
  4.5、flush 执行方法,传递参数
上面的这写方法都是工人发送出去的数据,发送出去以后,ReactNativeContext上下文中就会一直frame,这里面会把工人的消息队列里面的数据一条条取出来,然后只要有消息,就执行消息

  5、发送消息,在react 一侧,在index.js的componentDidMount里面直接发送消息:

postMessage({type:'sceneLoadEnd'})//隐藏loading图
具体的消息传递就是,view调用frame方法,渲染每一帧的方法,也就是调用了上下文的frame方法,这个方法里面就是从工人的消息队列取数据,这个数据就是上面顶一个监听方法,监听的方法渠道对应的type,然后执行具体的方法,就是隐藏loading。
有啥不懂得,欢迎来询哦,QQ&微信:674668211

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • react vr中文网:www.vr-react.com react vr qq群:481244084 示例源码 ...
    liu_520阅读 1,016评论 0 1
  • react vr中文网:www.vr-react.com react vr qq群:481244084 示例源码 ...
    liu_520阅读 3,632评论 4 6
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,363评论 25 707
  • 1.昨天周日上午开车去武汉站了,二师兄出差,叫不到车。他开口让我送他时候我十分惊讶和无限抗拒。道路积雪严重,一般的...
    苏小文S阅读 288评论 0 0
  • 为什么要亲子共读?念故事是为了跟孩子说话! 如果孩子童稚时代的一切都将忘记,那么父母亲花费那么多心力值不值得呢? ...
    猴哥释然阅读 161评论 0 1