我在屏幕顶部创建了一些小精灵,然后它们应该下降,在穿过底线之后它们会消失。问题是,当他们穿过屏幕时,有时他们会滞后是非常明显的。几毫秒,但它可以看到它。它完全随机发生。他们用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;
}
也许有人已经遇到过这个问题,我不知道为什么会这样,
答案 0 :(得分:0)
滞后很可能是由垃圾收集引起的,因为你在游戏循环中不断分配内存。
您希望尽可能避免在游戏循环中调用 new ,如果您调用new,则希望尽可能重用这些对象。
查看libgdx中的池 http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/Pool.html
如果您从某个方法(如Vector2)返回一个对象,则创建一个静态实例并将该对象重用为返回值。请注意,这不是线程安全的,再次调用该方法将覆盖第一次调用的值。
如果我是你,我会搜索“新”字样的任何实例。在你的代码中,并确保在游戏循环中没有频繁调用它们。您还希望了解调用将创建对象实例的方法。将整数转换为字符串这样简单的事情会浪费内存,也会产生更明显的事情,例如创建数组副本。
您应该发现这对跟踪内存分配很有用。 https://visualvm.java.net/