每次碰撞迭代的渐进滞后 libGDX

Progressive lag with each collision iteration libGDX

您好,我正在利用业余时间使用 AIDE 和 libGDX 开发一款游戏。尽管 AIDE 缺少 libGDX API 的一些方法,但我不得不创建一些变通方法来弥补缺少的方法。 所以我的问题是,每次发生碰撞时,应用程序都会变得越来越迟钝。没有新的纹理被绘制并且不会消失。只是一个糟糕的实施,旨在将您推出所述碰撞板块。在发生几次碰撞之前,它运行良好。我的想法是,它会在每次碰撞时创建一个新变量并将其存储到内存中,从而导致泄漏。但我真的不能说是不是这样。哦,我想补充一点,我没有电脑,只有 phone。这是我的动态class

move.java

public class move
{
    float posX;
    float posY;
    float touchedOnScreenX;
    float touchedOnScreenY;
    float centerOfScreenX;
    float centerOfScreenY;
    float posXSetter;
    float posYSetter;
    float Speed = 150;
    float mapBoundsWidth;
    float mapBoundsHeight;
    boolean upperBounds;
    boolean lowerBounds;
    boolean rightBounds;
    boolean leftBounds;
    boolean tileCollition;



    public move() {

    }

    public void renderMove(float delta) {


        if(Gdx.input.isTouched()) {
            screenAndTouchInfo();
            checkBoundsBoolean();
            checkForCollision();
        }
    }

    //slows game down
    private void checkForCollision()
    {
        if (upperBounds == false)
        {
            if (lowerBounds == false)
            {
                if (rightBounds == false)
                {
                    if (leftBounds == false)
                    {
                        if (tileCollition == false)
                        {
                            movement();
                        }
                        else
                        {
                            collitionSide();
                        }
                    }
                    else
                    {
                        posX++;
                    }
                }
                else
                {
                    posX--;
                }
            }   
            else
            {
                posY++;
            }
        }
        else
        {
            posY --;
        }
    }

    private void movement()
    {
        posYSetter = posY;
        posXSetter = posX;
        if (touchedOnScreenX < centerOfScreenX)
        {
            posX -= Gdx.graphics.getDeltaTime() * Speed;

        }
        else
        {
            posX += Gdx.graphics.getDeltaTime() * Speed;

        }
        if (touchedOnScreenY < centerOfScreenY)
        {
            posY -= Gdx.graphics.getDeltaTime() * Speed;

        }
        else
        {
            posY += Gdx.graphics.getDeltaTime() * Speed;

        }
        if (touchedOnScreenY < centerOfScreenY + 64 && touchedOnScreenY > centerOfScreenY - 64)
        {
            posY = posYSetter;

        }
        if (touchedOnScreenX < centerOfScreenX + 64 && touchedOnScreenX > centerOfScreenX - 64)
        {
            posX = posXSetter;

        }
    }

    //buggy and slows game down. Can push you into tile if input is the opposite of the side
    public void collitionSide() {
        if (tileCollition == true){
            if (touchedOnScreenX < centerOfScreenX)
            {
                posX = posX +10;
            }
            else
            {
                posX = posX - 10;

            }
            if (touchedOnScreenY < centerOfScreenY)
            {
                posY = posY +10;
            }
            else
            {
                posY = posY -10;
            }
        }
    }

    private void screenAndTouchInfo()
    {
        touchedOnScreenX = Gdx.input.getX();
        touchedOnScreenY = (Gdx.graphics.getHeight() - Gdx.input.getY());
        centerOfScreenX = Gdx.graphics.getWidth() / 2;
        centerOfScreenY = Gdx.graphics.getHeight() / 2;
    }
    //slows game down
    private void checkBoundsBoolean()
    {
        if (posX > mapBoundsWidth)
        {
            rightBounds = true;
        }
        else {
            rightBounds = false;
        }
        if (posY > mapBoundsHeight)
        {
            upperBounds = true;
        }
        else {
            upperBounds = false;
        }
        if (posX < mapBoundsWidth - mapBoundsWidth)
        {
            leftBounds = true;
        }
        else {
            leftBounds = false;
        }
        if (posY < mapBoundsHeight - mapBoundsHeight)
        {
            lowerBounds = true;
        }
        else {
            lowerBounds = false;
        }
    }

    public void setTileCollision(boolean tileCollision) {
        this.tileCollition = tileCollision;
    }

    public float getPosX() {
        return posX;
    }

    public float getPosY() {
        return posY;
    }

    public float getTouchedOnScreenX() {
        return touchedOnScreenX;
    }

    public float getTouchedOnScreenY() {
        return touchedOnScreenY;
    }

    public float getCenterOfScreenX() {
        return centerOfScreenX;
    }

    public float getCenterOfScreenY() {
        return centerOfScreenY;
    }

    public void setMapboundsWidth(float width) {
        this.mapBoundsWidth = width;
    }

    public void setMapboundsHeight(float height) {
        this.mapBoundsHeight = height;
    }
}

我知道有很多代码需要梳理,如果不是总是很清楚发生了什么,我很抱歉。我将它重构到更容易理解的地方。哦,如果有人能告诉我为什么 AIDE 缺少 libGDX 的一些方法,那会很好 too.The 最值得注意的是 Cell.setTile()。我知道在 libGDX 的 API 中,可以在他们的文档中找到。但是当我实现它时,它会抛出 class Cell 错误的未知方法。我也研究过如何使用该方法,但无济于事。必须创建 int[][] 地图和一个 for 循环以使用另一个 Texture[] 绘制地图。有用。哈哈。感谢您甚至花时间看我冗长的双重问题的人。希望有人能告诉我为什么这种延迟是由上述碰撞造成的。

我建议将您的碰撞代码移到一个单独的线程中。这应该会显着提高性能:

Executor executor = Executors.newSingleThreadExecutor();
  executor.execute(new Runnable() {
     @Override
     public void run() {
        // Physics loop goes here
     }
});

确保在处理屏幕时关闭执行器。