绿宝石中的垂直空白(VBlank)
要点:什么是 VBlank,以及它在宝可梦生成中的影响。
什么是 VBlank?
VBlank 中断是 GBA 用于刷新画面的机制。它每 1/60 秒触发一次,独立于正常的游戏逻辑执行。
当 VBlank 中断发生时,正常的游戏程序执行会被暂停,转而执行与 VBlank 相关的代码,完成后再恢复原本的游戏程序流程。
在 GBA 的宝可梦游戏中,VBlank 相关的代码会将乱数值推进一次。也就是说,每 1/60 秒,乱数会推进 1 帧。
VBlank 的影响
以下是宝可梦生成的简化流程:
步骤 | 在该步骤开始时推进的帧数 |
---|
生成 PID | 1 |
生成个体值 IV | 2 |
在大多数情况下,流程正如所示,宝可梦的 PID 用的是第 1 帧的乱数值,IV 用的是第 2 帧的乱数值。
但在少数情况下,会在过程中突发 VBlank,从而改变了生成结果:
步骤 | 在该步骤开始时推进的帧数 |
---|
生成 PID | 1 |
VBLANK:乱数推进 | 2 |
生成个体值 IV | 3 |
尽管宝可梦的生成流程是在同一乱数帧开始的,但最终 IV 却不同,因为本应使用第 2 帧的乱数值,现在使用的是第 3 帧。
VBlank 发生频率
如前所述,VBlank 每 1/60 秒发生一次,确切地说是每 280,896 条 CPU 指令周期。GBA 执行的每一项操作(例如加法、读取数据)都会占用一定的 CPU 指令周期。
宝可梦生成中的某个步骤所花的周期越多,就越有可能在执行时碰到 VBlank。
- 例:一个步骤如果耗时 28,000 指令周期,约有 10% 的几率发生 VBlank。
- 例:一个步骤耗时 300,000 指令周期,几乎必定会遇到 1 次甚至 2 次 VBlank。
定点宝可梦生成的指令很少,因此 VBlank 比较罕见。
相反,野生宝可梦若遇到同步特性作为首发宝可梦,会触发更多的乱数判定,导致指令周期大幅上升,因此 VBlank 更为常见。
幸运的是,在大多数情况下,宝可梦生成中发生的 VBlank 并不会影响结果。但在某些时候,它确实会影响宝可梦的生成,造成我们所说的 方法 2-4。
特别鸣谢