为什么变量更改要花几毫秒的延迟才能生效?

时间:2019-04-05 14:25:14

标签: javascript

我遇到了一个有趣的问题,即控制降落伞运动的自动收报机。无论何时改变加速度方向,它都会花60毫秒才生效,这会导致一些奇怪的行为,例如降落伞撞到游戏墙,并在交换方向之前进行“磨削”。

当碰到墙壁时,在此测试用例中,应立即更改方向。这似乎是造成此问题的偏移循环,但是我在没有循环的情况下运行了基础代码,并且它仍然以相同的方式起作用。

基本引擎是Phaser 3,tick()直接在其Update()循环内运行。

我已经直接使用setInterval和requestAnimationFrame进行了测试-它们会产生相同的奇数延迟。

tick(time)
{
    if (this.last == 0)
    {
        this.last = time;
    }

    let offSet = Math.min(time - this.last, 5000);

    let dragMod = (1 - this.drag);

    for(let i = 0; i < offSet; i++);
    {
        if (!this.isGrounded)
        {
            if (this.AccelDirection == -1)
            {
                this.XSpeed += -this.windPower;
            }

            if (this.AccelDirection == 0)
            {
                this.XSpeed = 0;
            }                 

            if (this.AccelDirection == 1)
            {
                this.XSpeed += this.windPower;
            } 

            this.YSpeed += this.gravity;
            this.X += this.XSpeed;
            this.Y += this.YSpeed;

            this.YSpeed *= dragMod;
            this.XSpeed *= dragMod;

            if (this.X >= 868)
            {
                this.X = 868; // Right //
                if (this.isMe)
                {
                    this.AccelDirection = -this.AccelDirection;
                    //this.scene.bounce();
                }

            }

            if (this.X <= 32)
            {
                this.X = 32; // Left //
                if (this.isMe)
                {
                    this.AccelDirection = -this.AccelDirection;
                    //this.scene.bounce();
                }
            } 

        } else {
            this.YSpeed = 0;
            this.XSpeed = 0;
        }

        if (this.Y > 868)
        {
            this.isGrounded = true;
        }
    }

    this.x = this.X;
    this.y = this.Y;
    this.last = time;
}

我已经用console.log观看了循环,它在达到条件的第二秒就识别出该循环,通常要等到改变之前最多59毫秒。

2 个答案:

答案 0 :(得分:1)

不确定这是否可以解决问题,但是您可以完全摆脱循环:

[
          { "type": "cell", "number": "702-123-4567" },
          { "type": "work", "number": "702-987-6543" }
        ]

答案 1 :(得分:1)

我明白了。原来是

let dragMod = (1 - this.drag);

这整个时间。不是网络循环,时间等。增加帧速率独立性会有所帮助,但是我必须更改拖动时间。这导致了异常的延迟。