Ruby 中的 Fiber 通常称为纤程,是一种非抢占式的多线程模型。
纤程不能在外部被终止,只能等待其主动让出执行权。
RGSS3 在事件解释器 Game_Interpreter 与显示文字信息的窗口 Window_Message 中都用到了纤程。
以 Window_Message 为例。
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
super
update_all_windows
update_back_sprite
update_fiber
end
在窗口更新时,对纤程进行了更新。
#--------------------------------------------------------------------------
# ● 更新纤程
#--------------------------------------------------------------------------
def update_fiber
if @fiber
@fiber.resume
elsif $game_message.busy? && !$game_message.scroll_mode
@fiber = Fiber.new { fiber_main }
@fiber.resume
else
$game_message.visible = false
end
end
#----------
@fiber = Fiber.new { fiber_main }
Fiber#new接受一个block,block里就是这个Fiber将要执行的任务。
一个Fiber有三种状态:Created、Running、Terminated,分别表示创建完成、执行、终止。
启动Fiber是通过Fiber#resume方法,这个Fiber将进入Running状态。
#--------------------------------------------------------------------------
# ● 处理纤程的主逻辑
#--------------------------------------------------------------------------
def fiber_main
$game_message.visible = true
update_background
update_placement
loop do
process_all_text if $game_message.has_text?
process_input
$game_message.clear
@gold_window.close
Fiber.yield
break unless text_continue?
end
close_and_wait
$game_message.visible = false
@fiber = nil
end