#==============================================================================
# ■ Main
#------------------------------------------------------------------------------
# 各定义结束后、从这里开始实际处理。
#==============================================================================
begin
# 准备过渡
# 设置系统默认字体
Font.default_name = (["方正舒体简体"])
Graphics.freeze
# 生成场景对像 (标题画面)
$scene = Scene_Title.new
# $scene 为有效的情况下调用 main 过程
while $scene != nil
$scene.main
@update_thread = Thread.new{loop{Graphics.update;sleep(9)}} if @update_thread.nil?
end
# 淡入淡出
Graphics.transition(20)
rescue Errno::ENOENT
# 补充 Errno::ENOENT 以外错误
# 无法打开文件的情况下、显示信息后结束
filename = $!.message.sub("No such file or directory - ", "")
File.open(filename, "w")
while $scene != nil
$scene.main
end
end
以下引用精灵使者于2007-6-2 12:15:10的发言:
我知道了……第一句每次重启都会新建线程,会越来越卡……而且还容易出现call stack error错误……似乎美兽修改阴影脚本就是用的第二句那种方法,可以保持只有一个进程……我想在游戏里使用的话我想添加到这里,你看行不行,夏娜?
#==============================================================================
# ■ Main
#------------------------------------------------------------------------------
# 各定义结束后、从这里开始实际处理。
#==============================================================================
begin
# 准备过渡
# 设置系统默认字体
Font.default_name = (["方正舒体简体"])
Graphics.freeze
# 生成场景对像 (标题画面)
$scene = Scene_Title.new
# $scene 为有效的情况下调用 main 过程
while $scene != nil
$scene.main
@update_thread = Thread.new{loop{Graphics.update;sleep(9)}} if @update_thread.nil?
end
# 淡入淡出
Graphics.transition(20)
rescue Errno::ENOENT
# 补充 Errno::ENOENT 以外错误
# 无法打开文件的情况下、显示信息后结束
filename = $!.message.sub("No such file or directory - ", "")
File.open(filename, "w")
while $scene != nil
$scene.main
end
end
[本贴由作者于 2007-6-2 12:26:27 最后编辑]
以下引用七夕小雨于2007-6-2 12:33:36的发言:
完全不明白………………
怎么后台会开一个新的线程……
以下引用亿万星辰于2007-6-2 13:36:42的发言:
以下引用七夕小雨于2007-6-2 12:33:36的发言:
完全不明白………………
怎么后台会开一个新的线程……
你就当每个线程是RM的一只手,这样只不过多给他加了一只而已
以下引用Benavii于2007-6-2 13:15:41的发言:
放那里灭有用,程序已经在调用每个$scene的Main方法了=v=
以下引用美兽于2007-6-2 14:43:47的发言:
白写了- -
只要有一个线程使用过Graphics.update就没问题,
话说这还是在看JAVA的Thread时忽然想到的...
所谓后台缓冲不过也是利用新建线程读取罢了,
但有个优先级影响传输效率。
以下引用美兽于2007-6-2 14:43:47的发言:
白写了- -
只要有一个线程使用过Graphics.update就没问题,
话说这还是在看JAVA的Thread时忽然想到的...
所谓后台缓冲不过也是利用新建线程读取罢了,
但有个优先级影响传输效率。
以下引用尤莉斯于2007-6-2 15:23:26的发言:
以下引用美兽于2007-6-2 14:43:47的发言:
白写了- -
只要有一个线程使用过Graphics.update就没问题,
话说这还是在看JAVA的Thread时忽然想到的...
所谓后台缓冲不过也是利用新建线程读取罢了,
但有个优先级影响传输效率。
优先级会影响传输效率- -?
以下引用尤莉斯于2007-6-2 15:31:29的发言:
新建的线成效率当然更低的吧
执行过程
主线程
后台线程
主线程
后台线程
主线程
后台线程
.....
以前就一个主线程效率是更高咯= =
以下引用尤莉斯于2007-6-2 12:31:41的发言:
远离main的好了 F11里的最上面新建 然后插入这句…… = =bb
以下引用FDR于2007-6-5 2:21:53的发言:
10s不调用Update,系统会抛出异常,捕获异常即可。另开一个线程的话,可能会造成屏幕的闪烁。
比如游戏正在重新绘制场景,画了一半,这个线程里面的update触发了,那么画一半的场景就会显示在屏幕上。另外一半画完系统原来的update触发,就可能会造成画面“闪烁”。
加在脚本最前面不是很安全,实在需要这样的处理,临时插入然后用完终止这个线程才是比较安全的使用方法。绝大多数情况可以使用捕获异常这种安全又正常的方法……
不过这只是理论上的分析,也许这样做并没有实际的影响,就好像10s抛出Hangup异常并不是什么大麻烦一样。
以下引用尤莉斯于2007-6-5 6:55:58的发言:
class << Graphics
alias origin_update update unless method_defined? :origin_update
def update
Thread.critical = true
origin_update
Thread.critical = false
end
end
这样就不会造成闪烁了吧。。。
以下引用FDR于2007-6-5 23:54:41的发言:
没细看前面的代码,如果原来没有这个保护的话那必须加上.因为如果没的话,就不仅仅是画面闪烁的问题,而是个错误.毕竟原来的update没有说明是线程安全的,多开一个线程调用它的话,很有可能在update的内部冲突.(想像update执行到一半另外一个update执行)
我说的画面闪烁来自于RGSS层面,不是update自身重复,考虑下面的步骤:
绘制近景
绘制人物
update
本来是都画好才显示到屏幕的,如果还有线程在update,那么可能刚刚绘制完近景就显示在屏幕上了.也有可能近景绘制了一半...这样的画面比起原来就是带点"闪烁"的
个人觉得Hangup异常是可以处理的.比起可能的画面破坏,自己多写点代码处理下异常没什么.异常本来就是让你处理而不是让你回避的.至于RGSS上用多线程,感觉在网络方面的应用要比这样的trick实在.
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |