非活动窗口使时间混乱

问题描述

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

enter image description here

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

enter image description here

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

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那个框架。

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