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

Project1

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

[已经解决] 关于Fiber.yield的用法

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3574
在线时间
2338 小时
注册时间
2015-8-25
帖子
960

开拓者

跳转到指定楼层
1
发表于 2018-8-1 05:45:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 七重 于 2018-8-1 07:37 编辑

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

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

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

Lv4.逐梦者

梦石
0
星屑
5479
在线时间
1668 小时
注册时间
2016-8-1
帖子
413
2
发表于 2018-8-1 06:19:43 | 只看该作者
我记得我以前看过的参考书里貌似讲解了这个,Fiber.yield是把事件压栈,然后再执行,貌似有并发处理的效果?

点评

谢谢你的回复,不过感觉针对的好像是命令,不是事件。  发表于 2018-8-1 21:39
阳光下的真实
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21631
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

3
发表于 2018-8-1 11:10:35 | 只看该作者
就和你说的一样,Fiber.yield 在这里的功能就是结束本帧的执行,下一帧再继续执行后续的内容……
你可以这么理解,同一时间内,只有一行代码会被执行,其他代码都在排队等着没人执行后自己开始执行

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

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

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

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

……

评分

参与人数 1+1 收起 理由
MireniamuYuki + 1 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4598
在线时间
1206 小时
注册时间
2016-4-7
帖子
982

开拓者

4
发表于 2018-8-1 16:29:27 | 只看该作者
http://www.blogjava.net/killme20 ... /03/11/315158.htmlh这个系列了解一下? 看完之后基本再难遇到fiber相关的问题了

点评

谢谢你的回复,不过可惜没有看的教程已经积累了一堆堆了,有暇的时候再了解下。  发表于 2018-8-1 22:12
附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复 支持 0 反对 1

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3574
在线时间
2338 小时
注册时间
2015-8-25
帖子
960

开拓者

5
 楼主| 发表于 2018-8-1 22:10:16 | 只看该作者
喵呜喵5 发表于 2018-8-1 11:10
就和你说的一样,Fiber.yield 在这里的功能就是结束本帧的执行,下一帧再继续执行后续的内容……
你可以这 ...

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

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

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


另外发现写在移动路线里面会报错。
不能 root fiber 什么的。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21631
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

6
发表于 2018-8-2 09:39:53 | 只看该作者
七重 发表于 2018-8-1 22:10
谢谢你的回复。再参考了默认脚本中的用法之后,我也知道应该怎么去用这个功能了。
用来改了一下自己以前 ...

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

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

评分

参与人数 1+1 收起 理由
七重 + 1 恩 THX

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 02:31

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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