查看: 3977|回复: 8

[已经解决] 关于多线程的问题。(可结贴)

[复制链接]
梦石
0
星屑
50
在线时间
25 小时
注册时间
2014-8-20
回帖
19
发表于 2014-11-27 01:38:21 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 boylove10 于 2014-11-27 19:03 编辑

我想要实现的效果:
战斗的时候有站立的动画,(我自己扒的大概5帧一幅图,这不重要)
按下J就有攻击动画,(键盘上随便哪个键,我已有全键的脚本,这不重要)
所以我就觉得用主线程来接受操作,副线程来负责更新动画。
但是线程我看不大明白,不知道是RUBY版本的原因还是其他的,有些从RUBY帮助手册上拷下来的例子在VA都运行结果不一样。所以我对多线程还是懂得很混乱。(多线程常用的XX锁也不知道是哪个模块)[pre lang="ruby" line="1"]s=Sprite.new
s.bitmap=Bitmap.new(50,50)
i=1
loop do
s.bitmap.draw_text(s.bitmap.rect,sprintf("%d",i=i+1))
Graphics.wait(10)
s.bitmap.clear
end[/pre]

精灵的更新在主线程里的时候就没出什么问题,一旦放都第二个线程的时候就不行了
[pre lang="ruby" line="1"]s=Sprite.new
s.bitmap=Bitmap.new(50,50)
i=1
t=Thread.new {
loop do
s.bitmap.draw_text(s.bitmap.rect,sprintf("%d",i=i+1))
Graphics.wait(10)#这里可能阻塞?
s.bitmap.clear
end
}
t.join
rgss_stop[/pre]
是什么地方的问题。
实际上还是对多线程的不懂,而且纯英文苦手啊。
终极效果就是做成格斗游戏,有过脚本的话请给我贴个地址,或者上述能以单线程完成的脚本的地址。


结贴总结:
并未完全解决原有的问题,暂时用纤程代替:
站内纤程资料地址:https://rpg.blue/thread-220654-1-1.html

(要不多用几个if,break可能也行,不知道ruby有没有C++的goto,说不定也成呢)

最后:谢谢各位的帮助

点评

goto 可用 catch 和 throw 实现——这不是异常处理的方法~  发表于 2014-11-28 12:31
Graphics.wait会阻塞  发表于 2014-11-27 17:14

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-11-27 12:29:55 | 显示全部楼层
RGSS 的多线程支持本来就不好(连 Mutex 都特么没有)

建议用 Fiber 凑合吧

点评

(我上次的Fiber就是用这个实现了Mutex,进而同步队列,进而Fiber  发表于 2014-11-27 17:10
VA有Mutex, 低版本没有但有等价物: Thread.critical=true  发表于 2014-11-27 17:09
哦,刚看到ruby是有MUTEX这个模块的,这就是什么什么锁吧?不过在VA里还是看不出作用,起码可以NEW了也不出错,难道ruby支持的RGSS也不一定支持么。  发表于 2014-11-27 16:57
啊...其实我也看不大懂纤程,百度里基本找不到RUBY的教程,中文网不完善,英文苦手。只能同过例子一个一个理解,有较好的教程地址么(脸红伸手)  发表于 2014-11-27 14:07
回复

使用道具 举报

梦石
1
星屑
23246
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2014-11-27 12:45:02 | 显示全部楼层
地图上,人物在行走的动画和玩家用按键控制人物行走的操作有用到多线程么……
回复

使用道具 举报

梦石
0
星屑
50
在线时间
25 小时
注册时间
2014-8-20
回帖
19
 楼主| 发表于 2014-11-27 12:57:17 | 显示全部楼层
喵呜喵5 发表于 2014-11-27 12:45
地图上,人物在行走的动画和玩家用按键控制人物行走的操作有用到多线程么…… ...

不是啊,是战斗的时候用的,最终效果是像MUGEN,和其他格斗游戏那样,DNF那样,如果不用多线程会麻烦死吧?
回复

使用道具 举报

梦石
1
星屑
23246
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2014-11-27 13:40:36 | 显示全部楼层
def update
    按键的更新
    动画的更新
end
def 按键的更新
    return if 攻击动画中
    如果按x建则进入攻击动画
end
def 动画的更新
    更新站立效果 if 非攻击动画中
    更新攻击效果 if 攻击动画中
end

loop do{ update }

点评

恩,其实我就是怕麻烦,才想用多线程的,我觉得单线要考虑的东西多,我就按你的方法先做做看。 谢谢!  发表于 2014-11-27 14:02

评分

参与人数 1梦石 +1 收起 理由
VIPArcher + 1 我很赞同

查看全部评分

回复

使用道具 举报

梦石
1
星屑
23246
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2014-11-27 13:56:56 | 显示全部楼层
顺便,一楼的例子,rgss_stop前加上t.join
回复

使用道具 举报

梦石
0
星屑
50
在线时间
25 小时
注册时间
2014-8-20
回帖
19
 楼主| 发表于 2014-11-27 14:16:28 | 显示全部楼层
喵呜喵5 发表于 2014-11-27 13:56
顺便,一楼的例子,rgss_stop前加上t.join

改了,VA里还是运行不正常。join不就是终止(暂停)当前线程,运行t,直到t运行完毕么,可是VA就是没有该有的反应。第二的例子应该是能看到字符的更新的,但是我那就是没出现,连个字符“2”都没显示,还会卡住,还出错“内存XXXXREAD不能"
你知道有在VA里成功使用多线程的脚本例子咩?
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-11-27 17:18:22 | 显示全部楼层
boylove10 发表于 2014-11-27 14:16
改了,VA里还是运行不正常。join不就是终止(暂停)当前线程,运行t,直到t运行完毕么,可是VA就是没有该 ...

垃圾回收:
  1. Thread.new do
  2.   loop do
  3.     GC.start
  4.     sleep 10
  5.   end
  6. end
复制代码
另外没事别用多线程。Fiber 并不难理解,图书馆里就有教程

点评

ruby 本身对多线程的支持就不是最好。而 RGSS 对多线程的支持很差  发表于 2014-11-28 12:28
里面讲的很详细啊,得好好消化一下。顺便问下别用多线程是指多线程对新手难以掌控,还是ruby的多线程实现的不好?  发表于 2014-11-27 18:46

评分

参与人数 1梦石 +1 收起 理由
VIPArcher + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
50
在线时间
25 小时
注册时间
2014-8-20
回帖
19
 楼主| 发表于 2014-11-27 18:30:06 | 显示全部楼层
为什么1L我不能点评啊,@晴兰 ,那不用Graphics.wait的话,根本看不到更新,咋办。我还异想天开的用sleep,也是一片黑。
话说为什么会阻塞,怎么样能时我的例子能用?
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部