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。
基本上,我在浏览器未激活时暂停了游戏 :)
这是一个奇怪的解释。我有一个粒子系统,我在其中的每一帧都创建一个新粒子,直到它们达到一定数量为止。这会产生类似条纹的效果,如下所示:
我遇到的问题是,当我切换到另一个 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。
基本上,我在浏览器未激活时暂停了游戏 :)