Libgdx用于循环滞后

时间:2016-11-05 15:30:19

标签: android libgdx

我的游戏有问题。游戏运行正常,直到我必须重新定位对象的时间,这发生在每一帧。例如,我必须重新定位一些停放的汽车(道路两侧约6辆汽车),汽车在屏幕上不断向下移动,然后它们重置并重新定位在顶部。我使用Poolable来节省资源。但是,在运行这些代码行时,游戏仍然非常激动。有什么办法可以改进代码来防止滞后吗?也许是新线程?如果是这样,那么创建新线程并在每一帧更新它的正确方法将是什么。

private void updateParkedVehicles(float delta){
    for (int i = 0; i < parkedCarLeft1Array.size; i++){
        parkedCarLeft1Array.get(i).update(delta);

        for (int c = 0; c < parkedCarLeft1Array.size; c++){
            if (c != i){
                if (Intersector.overlaps(parkedCarLeft1Array.get(i).bounds, parkedCarLeft1Array.get(c).bounds)){
                    parkedCarLeft1Array.get(i).reset();

                }
            }
        }
    }


    for (int i = 0; i < parkedCarRight1Array.size; i++){
        parkedCarRight1Array.get(i).update(delta);

        for (int c = 0; c < parkedCarRight1Array.size; c++){
            if (c != i){
                if (Intersector.overlaps(parkedCarRight1Array.get(i).bounds, parkedCarRight1Array.get(c).bounds)){parkedCarRight1Array.get(i).reset();
                }
            }
        }
    }

}

2 个答案:

答案 0 :(得分:0)

处理游戏中物品的一种方法是使用Scene2d。 Scene2D允许您离开必须移动自己的项目。相反,如果你需要移动它们而不必处理每一帧更新,你可以给它们指示(作为导演)。

简而言之,要添加一个Action,你会这样做:

if(SomeCondition){
   MoveToAction moveCar = new MoveToAction();
   moveCar.setPosition(anX,anY);
   moveCar.setDuration(aDuration);
   myCarActor.addAction(moveCar);
}

这样,您唯一需要检查的是事件的发生,并且您调用您的函数仅将汽车移动一次(当事件发生时)。

LibGdx将负责每帧更新你的演员。 你在循环中唯一需要做的就是检查碰撞。如果它们出现,那么你将为你的演员分配一个新的动作。

要记住的另一件事,如果你使用Scene2D,你可以使用相机。这意味着如果您需要滚动,而不是移动每个项目,只需移动相机(具有缩放所需的所有便捷方法等)。

有关Scene2D的详细信息,请查看:https://github.com/libgdx/libgdx/wiki/scene2d

有关动作的详细信息,请查看以下内容: https://github.com/libgdx/libgdx/wiki/Scene2d#actions

希望它有所帮助。

答案 1 :(得分:0)

在我看来,问题在于通过数组进行双循环 - &gt; O(n ^ 2)复杂度!!

我不清楚为什么你需要检查每辆车与每辆车的重叠,除了这辆车,如果“汽车在屏幕上不断向下移动,然后他们重置并重新定位在顶部”。对于所描述的行为,最简单的方法是检查当前y位置是否小于0,如果是,则检查休息位置:

for (Car car : parkedCarLeft1Array){
        car.update(delta);
        if (car.getY <= 0) {
            car.reset();
        }
    }

我假设你用update()方法更新了汽车位置。