Project1

标题: 关于多线程的问题。(可结贴) [打印本页]

作者: boylove10    时间: 2014-11-27 01:38
标题: 关于多线程的问题。(可结贴)
本帖最后由 boylove10 于 2014-11-27 19:03 编辑

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


精灵的更新在主线程里的时候就没出什么问题,一旦放都第二个线程的时候就不行了
RUBY 代码复制
  1. s=Sprite.new
  2. s.bitmap=Bitmap.new(50,50)
  3. i=1
  4. t=Thread.new {
  5. loop do
  6. s.bitmap.draw_text(s.bitmap.rect,sprintf("%d",i=i+1))
  7. Graphics.wait(10)#这里可能阻塞?
  8. s.bitmap.clear
  9. end
  10. }
  11. t.join
  12. rgss_stop

是什么地方的问题。
实际上还是对多线程的不懂,而且纯英文苦手啊。
终极效果就是做成格斗游戏,有过脚本的话请给我贴个地址,或者上述能以单线程完成的脚本的地址。


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

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

最后:谢谢各位的帮助

作者: taroxd    时间: 2014-11-27 12:29
RGSS 的多线程支持本来就不好(连 Mutex 都特么没有)

建议用 Fiber 凑合吧
作者: 喵呜喵5    时间: 2014-11-27 12:45
地图上,人物在行走的动画和玩家用按键控制人物行走的操作有用到多线程么……
作者: boylove10    时间: 2014-11-27 12:57
喵呜喵5 发表于 2014-11-27 12:45
地图上,人物在行走的动画和玩家用按键控制人物行走的操作有用到多线程么…… ...

不是啊,是战斗的时候用的,最终效果是像MUGEN,和其他格斗游戏那样,DNF那样,如果不用多线程会麻烦死吧?
作者: 喵呜喵5    时间: 2014-11-27 13:40
def update
    按键的更新
    动画的更新
end
def 按键的更新
    return if 攻击动画中
    如果按x建则进入攻击动画
end
def 动画的更新
    更新站立效果 if 非攻击动画中
    更新攻击效果 if 攻击动画中
end

loop do{ update }
作者: 喵呜喵5    时间: 2014-11-27 13:56
顺便,一楼的例子,rgss_stop前加上t.join
作者: boylove10    时间: 2014-11-27 14:16
喵呜喵5 发表于 2014-11-27 13:56
顺便,一楼的例子,rgss_stop前加上t.join

改了,VA里还是运行不正常。join不就是终止(暂停)当前线程,运行t,直到t运行完毕么,可是VA就是没有该有的反应。第二的例子应该是能看到字符的更新的,但是我那就是没出现,连个字符“2”都没显示,还会卡住,还出错“内存XXXXREAD不能"
你知道有在VA里成功使用多线程的脚本例子咩?
作者: taroxd    时间: 2014-11-27 17:18
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 并不难理解,图书馆里就有教程
作者: boylove10    时间: 2014-11-27 18:30
为什么1L我不能点评啊,@晴兰 ,那不用Graphics.wait的话,根本看不到更新,咋办。我还异想天开的用sleep,也是一片黑。
话说为什么会阻塞,怎么样能时我的例子能用?




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