设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5536|回复: 7
打印 上一主题 下一主题

[有事请教] mv是如何实现 事件 并行处理的?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3077
在线时间
337 小时
注册时间
2018-3-28
帖子
203
跳转到指定楼层
1
发表于 2019-8-22 18:34:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
如题 js不是说是单线程
为何mv事件都还能并行处理
它是如何实现的呢?  

会问到这个 主要是因为我想在自己的代码里 实现多线程  
目前是使用settimeout 定时器  做了个仿的多线程 但是这个貌似并不好用 或者是我理解错误?
我是菜鸟一个 打代码都靠懵的 求大神指点~
用mv做了两款游戏,有兴趣的可以瞧一瞧:
《有毛病》--- 休闲、探索、策略、剧情、恐怖 都有那么一些,就是没有战斗。挺骚挺有意思的一个游戏。
steam链接:点击这里


《留离》--- 探索、高自由度、ARPG、战斗,就是没有啥剧情。
steam链接:点击这里

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

2
发表于 2019-8-22 18:53:03 | 只看该作者
应该是轮流吧
一帧数一条线把所有事件串起来

点评

emmm 有道理 我试试看能不能运用到我的代码里 感谢大佬~  发表于 2019-8-22 19:53
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2850
在线时间
508 小时
注册时间
2012-1-24
帖子
37
3
发表于 2019-8-23 13:44:53 | 只看该作者
就跟单核处理器差不多把,放歌的同时还能刷网页、后台下载东西。主要是因为处理器算力充足,一个周期能处理多个任务。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1912
在线时间
1554 小时
注册时间
2013-4-13
帖子
917
4
发表于 2019-8-23 18:21:25 | 只看该作者
本帖最后由 沉滞的剑 于 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
夏普的道具店

塞露提亚-道具屋的经营妙方同人作品
发布帖:点击这里
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1093
在线时间
121 小时
注册时间
2019-2-2
帖子
9
5
发表于 2019-8-24 13:15:00 | 只看该作者
emmm,所谓真正的多线程也是不存在的,操作系统不过是用中断机制分割每个应用程序,短时间内让CPU来回切换处理,因为现在cpu每秒几十亿次计算是标配所以根本感觉不出来。。。但是js的话,咱没有往里研究过,够写插件就行。。。至于并行处理,貌似在游戏里会每帧调用一个方法update进行操作来更新画面事件,就比如人物的行走,事件的触发等等,重写update方法并且调用自己的判断事件就可以实现一个假的多线程qwq。
应该是这样吧233

点评

感谢  发表于 2019-8-25 10:17
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1532
在线时间
434 小时
注册时间
2023-5-18
帖子
156
6
发表于 2023-6-13 08:30:02 | 只看该作者
沉滞的剑 发表于 2019-8-23 18:21
1.
js是单线程的, 但是js引擎支持异步
也就是说可以让一部分代码过一阵子再执行

请问地图上2个不同的事件,分别设置了一页并行事件页,那在一帧中,是先更新ID号大的事件吗
B站传送门
-----------------------------------------------------------------------
“与其为做不到的事耿耿于怀,不如为自己做到的事而喜悦
吧!”

-----------------------------------------------------------------------
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-28 00:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表