Project1

标题: 关于Fiber.yield的用法 [打印本页]

作者: 七重    时间: 2018-8-1 05:45
标题: 关于Fiber.yield的用法
本帖最后由 七重 于 2018-8-1 07:37 编辑

检索了一下以前有人问过一样的问题,不过解答好像已经被删除了。
f1里面其实也是略有说明的,不过如果有说明一下在实际场合下起到的作用就好了。

以前写一个在地图上通过按键SceneManager.call,或者同时执行复数需要超过一帧时间执行的事件的时候,发现是会有呼出不成功的情况发生的。

今天看到别人写了个一模一样的功能,但是结尾加了句Fiber.yield。
这里的Fiber.yield起到的作用是什么呢?
RUBY 代码复制
  1. SceneManager.call(Scene_XXX)
  2. Fiber.yield


作者: 穿越时空之剑    时间: 2018-8-1 06:19
我记得我以前看过的参考书里貌似讲解了这个,Fiber.yield是把事件压栈,然后再执行,貌似有并发处理的效果?
作者: 喵呜喵5    时间: 2018-8-1 11:10
就和你说的一样,Fiber.yield 在这里的功能就是结束本帧的执行,下一帧再继续执行后续的内容……
你可以这么理解,同一时间内,只有一行代码会被执行,其他代码都在排队等着没人执行后自己开始执行

第1帧:
其他地方各种更新……
啊,轮到我开始执行了
执行列表里的第一条
执行列表里的下一条
执行列表里的下下一条
执行列表里的下下下一条
啊,碰到 Fiber.yield 了,我该做的事情做完了,下一个
其他地方各种更新……

第2帧:
其他地方各种更新……
啊,轮到我开始执行了
执行列表里的下一条
执行列表里的下下一条
啊,下一条是显示对话,显示完了 Fiber.yield 了
我该做的事情做完了,下一个
其他地方各种更新……

第3帧:
其他地方各种更新……
啊,轮到我开始执行了
啊,还在显示对话,玩家也没按确定键,那我 Fiber.yield 吧
我该做的事情做完了,下一个
其他地方各种更新……

第4帧:
其他地方各种更新……
啊,轮到我开始执行了
啊,虽然还在显示对话,但玩家按确定键,我可以继续执行了
执行列表里的下一条

……
作者: shitake    时间: 2018-8-1 16:29
http://www.blogjava.net/killme20 ... /03/11/315158.htmlh这个系列了解一下? 看完之后基本再难遇到fiber相关的问题了
作者: 七重    时间: 2018-8-1 22:10
喵呜喵5 发表于 2018-8-1 11:10
就和你说的一样,Fiber.yield 在这里的功能就是结束本帧的执行,下一帧再继续执行后续的内容……
你可以这 ...

谢谢你的回复。再参考了默认脚本中的用法之后,我也知道应该怎么去用这个功能了。
用来改了一下自己以前留下的一些冲突,真的很有用。
又学到了一个有用的知识,泪流满面。。

实际自己用起来发现,这东西好像也只能像默认脚本那样,
确认好可能有什么可能的冲突。然后自己设置一段 Fiber.yield while XXXXXX

实际上只单写Fiber.yield是什么意思我还是有点不太能理解。比如上面call场景的例子。
虽然用是会用。
它是代表了只剩下自己一个任务为止前都不动作的意思么。


另外发现写在移动路线里面会报错。
不能 root fiber 什么的。
作者: 喵呜喵5    时间: 2018-8-2 09:39
七重 发表于 2018-8-1 22:10
谢谢你的回复。再参考了默认脚本中的用法之后,我也知道应该怎么去用这个功能了。
用来改了一下自己以前 ...

因为 Fiber.yield 并不是只是一个单条的语句,
它和 continue break 一样是用在特定结构中的
这里有一篇可能会对你有帮助的文章
https://rpg.blue/thread-406532-1-1.html

但想具体了解的话建议还是去搜索 Ruby纤程相关的资料去研究




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