Project1

标题: mv是如何实现 事件 并行处理的? [打印本页]

作者: wr282828    时间: 2019-8-22 18:34
标题: mv是如何实现 事件 并行处理的?
如题 js不是说是单线程
为何mv事件都还能并行处理
它是如何实现的呢?  

会问到这个 主要是因为我想在自己的代码里 实现多线程  
目前是使用settimeout 定时器  做了个仿的多线程 但是这个貌似并不好用 或者是我理解错误?
我是菜鸟一个 打代码都靠懵的 求大神指点~
作者: yang1zhi    时间: 2019-8-22 18:53
应该是轮流吧
一帧数一条线把所有事件串起来
作者: qq302849815    时间: 2019-8-23 13:44
就跟单核处理器差不多把,放歌的同时还能刷网页、后台下载东西。主要是因为处理器算力充足,一个周期能处理多个任务。
作者: 沉滞的剑    时间: 2019-8-23 18:21
本帖最后由 沉滞的剑 于 2019-8-23 18:24 编辑

1.
js是单线程的, 但是js引擎支持异步
也就是说可以让一部分代码过一阵子再执行
异步和并行不一样, 异步采取的是队列方式来执行代码
当异步任务完成了, 由浏览器通知引擎, 引擎将回调代码放入任务队列
如果当前任务队列中还有代码在执行, 那么新的回调代码将排队等着
其他异步任务完成后也会加入这个队列
当当前的代码执行完毕了, 如果队列不为空则执行最先进入队列的代码
回调代码保证在当前代码之后执行
但是不保证和其他回调代码的执行顺序

2.
setTimeout就是一个异步操作, 它并不是js标准的一部分
它在被执行后调用的是native的代码, 也就是浏览器的接口api
你的回调函数应该会被正常执行
你可以贴一下你的代码看看
不过由于js是单线程的, 所以不会有一个代码执行一半切换到其他代码的情况
它们会老老实实按照队列顺序执行

有一个类似可以实现多线程的技术叫做协程
它并不能像真正多线程一样做到指令级别的切换
它的本质只是把回调代码切的更细了而已,
因为异步操作不保证顺序,
所以不同任务的不同回调函数会夹杂在一起挤入队列
给人一种并行的错觉

3.
rm的事件也不是同步执行的
而是每一帧更新所有对象的状态
举个例子,
假如舞台上有两个球正在运动
你在每一秒的时候计算一下每个球的位置
你只能一个一个球画下来, 但是这段时间世界是静止的
然后每次你再把这个画面展示给别人看
人是看不出你先画了哪一个, 后画了哪一个的
只是觉得两个球同时在动而已


===================
4. 补充
上面这个一帧的概念是由另外一个浏览器接口API提供的
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame
你可以看成是间隔为屏幕刷新率的setTimeOut
作者: Dayflowers    时间: 2019-8-24 13:15
emmm,所谓真正的多线程也是不存在的,操作系统不过是用中断机制分割每个应用程序,短时间内让CPU来回切换处理,因为现在cpu每秒几十亿次计算是标配所以根本感觉不出来。。。但是js的话,咱没有往里研究过,够写插件就行。。。至于并行处理,貌似在游戏里会每帧调用一个方法update进行操作来更新画面事件,就比如人物的行走,事件的触发等等,重写update方法并且调用自己的判断事件就可以实现一个假的多线程qwq。
应该是这样吧233
作者: Arrose    时间: 2023-6-13 08:30
沉滞的剑 发表于 2019-8-23 18:21
1.
js是单线程的, 但是js引擎支持异步
也就是说可以让一部分代码过一阵子再执行

请问地图上2个不同的事件,分别设置了一页并行事件页,那在一帧中,是先更新ID号大的事件吗




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1