Parallel Process Events Execution Bug Fix.
There is a problem with the execution of Parallel Process events in RPG Maker VX Ace (at least at the time of writing). Unlike Autorun events, they are not executed every update cycle (frame) by default due to a misplaced line in Game_Interpreter. The execution of the Parallel Process events skips one frame after one successful execution, potentially causing serious synchronization problems for event based systems.
That behavior is completely unexpected and counterintuitive, and has the potential of making your game feel unresponsive to your players if you rely on Parallel Process events for any system that requires player input (like mini games).
How to corroborate the problem?
The easier way is to make a Parallel Process event report the game's frame count. To do that, simply create a Parallel Process event and add a Call Script command on it with the following:
Code:
Solistra was kind enough to provide a video showing the problem and comparing the execution with Autorun events (which works as expected):
What causes the bug?
Event "update" method setups the interpreter only if it is not "running":
Code:
- def update super check_event_trigger_auto return unless @interpreter @interpreter.setup(@list, @event.id) unless @interpreter.running? @interpreter.update end
复制代码
"running?" is defined as the following in Game_Interpreter:
Code:
- def running? @fiber != nil end
复制代码
and the "run" method for the interpreter is the following:
Code:
- def run wait_for_message while @list[@index] do execute_command @index += 1 end Fiber.yield @fiber = nil end
复制代码
The problem is that the control is passed back to the caller before the "@fiber = nil" line is executed, so by the time of the next Event update cycle, the Interpreter is still "running" and won't setup again, making it skip one update cycle because when the Fiber gains back control, it will execute the pending "@fiber = nil" line, and the condition for the Interpreter update won't be met:
Code:
- def update @fiber.resume if @fiber end
复制代码
How to fix the problem?
The solution is simple:
Code:
- # Parallel Process Events Execution Bug Fix.# Version 1.0.0# 09/02/15 - DD/MM/YY# www.rpgmakersource.com# forums.rpgmakersource.comclass Game_Interpreter # Overwrites default method with the fixed version. def run wait_for_message while @list[@index] do execute_command @index += 1 end @fiber = nil Fiber.yield endend
复制代码
Pasting the above code right below the default scripts, or anywhere below Game_Interpreter and above any custom script, will fix the problem.
Terms of Use
The code is free. You can use it in any commercial or non commercial game. Credits are appreciated but not necessary. Don't remove the original header.
本贴来自国际rpgmaker官方论坛作者:♥SOURCE♥处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:
https://forums.rpgmakerweb.com/threads/parallel-process-events-execution-bug-fix.36786/