Inactive window 会打乱时间

Inactive window makes messes with timing

这是一个奇怪的解释。我有一个粒子系统,我在其中的每一帧都创建一个新粒子,直到它们达到一定数量为止。这会产生类似条纹的效果,如下所示:

我遇到的问题是,当我切换到另一个 window 并返回到我的页面时,似乎所有这些粒子都是同时产生的,而不是条纹,只是点出现:

粒子创建和回收的代码在这里:

Update(felapsed){
this.AddParticle();

let vec = GetVectorFromAngle(this.Player.Rigidbody.Orien);
vec.Mult(-1 * 50);

for (let i = 0; i < this.Particles.length; i++){
  let item = this.Particles[i];

  item.DrawRes.Opacity = Lerp(0,1,item.Lifetime);
  item.Lifetime -= felapsed;

  if (item.Lifetime < 0){item.Restart(this.Rigidbody.Pos, copyInstance(vec));}

}

添加粒子功能在这里:

if (this.ParticleCount < this.ParticleLimit){
  let p = new this.ParticleType();
  this.Particles.push(p);
  Game.AddObject(p);
  this.ParticleCount++;
}

最后是 Particle.Restart 函数:

this.Lifetime = this.Life;
this.Rigidbody.Pos = locate;
this.Rigidbody.Vel.Mult(0);
this.Rigidbody.Vel = vel;

我怀疑我在做一些愚蠢的事情,但我没有注意到它,有什么提示吗?

我找到了解决方案。当浏览器处于非活动状态或不同的选项卡处于活动状态时,帧时间会增加超过正常预期结果,直到游戏选项卡处于活动状态。这意味着我所有的粒子都会死掉并在同一帧重新启动,因此它们会同步。

我选择的修复是非常不完整的,会做得更好,但在每一帧的开始,我检查 felapsed 以确保它不会超过正常预期时间 (0.6),如果超出,只需将 felapsed 设置为该帧为 0。

基本上,我在浏览器未激活时暂停了游戏 :)