LibGDX,在移动物体时间歇性滞后

时间:2015-06-03 00:02:31

标签: android libgdx

我在屏幕顶部创建了一些小精灵,然后它们应该下降,在穿过底线之后它们会消失。问题是,当他们穿过屏幕时,有时他们会滞后是非常明显的。几毫秒,但它可以看到它。它完全随机发生。他们用Gdx.graphics.getDeltaTime()改变他们的位置;

    public void update (float deltaTime) {
        updateMotionX(deltaTime);
        updateMotionY(deltaTime);

        // Move to new position
        position.x += velocity.x * deltaTime;
        position.y += velocity.y * deltaTime;
}

以下是产生它们的代码:

    private Sheep spawnSheep(){
    Sheep sheep = new Sheep();
    sheep.dimension.set(dimension);

    // select random cloud image
    sheep.setRegion(regSheeps.random());

    // position
    Vector2 pos = new Vector2();

    pos.x = -0.19f; // position after end of level
    pos.y = 5;

    sheep.position.set(pos);

    //speed
    Vector2 speed = new Vector2();
    speed.y = 3.5f;
    sheep.terminalVelocity.set(speed);
    speed.y *= -1;
    sheep.velocity.set(speed);
    return sheep;

}

也许有人已经遇到过这个问题,我不知道为什么会这样,

1 个答案:

答案 0 :(得分:0)

滞后很可能是由垃圾收集引起的,因为你在游戏循环中不断分配内存。

您希望尽可能避免在游戏循环中调用 new ,如果您调用new,则希望尽可能重用这些对象。

查看libgdx中的池 http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/Pool.html

如果您从某个方法(如Vector2)返回一个对象,则创建一个静态实例并将该对象重用为返回值。请注意,这不是线程安全的,再次调用该方法将覆盖第一次调用的值。

如果我是你,我会搜索“新”字样的任何实例。在你的代码中,并确保在游戏循环中没有频繁调用它们。您还希望了解调用将创建对象实例的方法。将整数转换为字符串这样简单的事情会浪费内存,也会产生更明显的事情,例如创建数组副本。

您应该发现这对跟踪内存分配很有用。 https://visualvm.java.net/