【问题标题】:Scrolling in a Stage in Libgdx seems to be laggy在 Libgdx 中的 Stage 中滚动似乎很滞后
【发布时间】:2014-10-29 21:18:21
【问题描述】:

所以我尝试使用this tutorial 作为起点来实现滚动。

我正在桌面上运行测试。

我在舞台上添加了一个ActionGestureListener,这样我就可以调用pan(...) function。它可以工作,但是当我尝试滚动时,它看起来真的很慢,有点像“振动”。

我错过了什么?

这是我目前所拥有的:

public class Store extends ScreenAdapter {


    SpriteBatch spritebatch;
    Stage stage;
    Texture texture;
    Image image;
    Group background, foreground;


    @Override
    public void show() {
        spritebatch = new SpriteBatch();
        stage = new Stage();
        background = new Group();
        foreground = new Group();
        texture = new Texture("badlogic.jpg");
        image = new Image(texture);

        //Building background/foreground.
        background.addActor(image);

        //Adding to stage.
        stage.addActor(background);
        stage.addActor(foreground);

        stage.addListener(new ActorGestureListener() {
            // TODO Auto-generated method stub

            @Override
                public void pan(InputEvent event, float x, float y, float deltaX, float deltaY) {

                stage.getCamera().translate(-deltaX, -deltaY, 0);
                stage.getCamera().update();
                //System.out.println(x + ", " + y + ", " + "      " + deltaX + ", " + deltaY);
            }
        });
        Gdx.input.setInputProcessor(stage);
    }


    @Override
    public void render(float delta){

        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        spritebatch.setProjectionMatrix(stage.getCamera().combined);

        spritebatch.begin();
        stage.draw();
        spritebatch.end();
    }

    @Override
    public void resize(int width, int height){
        System.out.println("resize() executed.");
        //stage.getViewport().update(width, height, true);
    }


    @Override
    public void dispose(){
        stage.dispose();
        texture.dispose();
        spritebatch.dispose();
    }
}

【问题讨论】:

    标签: scroll libgdx stage


    【解决方案1】:

    您不应在 show 方法中为字段对象重新分配内存。这将使垃圾收集器发疯,并可能导致您看到的一些滞后。将 show() 中的所有新语句移动到类构造函数中或直接移动到字段成员中,如下所示:

    public class Store extends ScreenAdapter {
    
    
    SpriteBatch spritebatch = new SpriteBatch();
    Stage stage = new Stage();
    // ETC...  
    

    这样,这些对象的内存只会在对象创建时分配一次。

    **编辑:我只是看了看,不应该像我假设的那样重复调用 show 方法,所以上面的方法可能不起作用。

    【讨论】:

      【解决方案2】:

      我终于通过编辑translate 呼叫摆脱了“振动”。

      stage.getCamera().translate(-deltaX / 2, -deltaY / 2, 0);

      它可以是 3 或您想要的任何增量,而不是除以 2。我觉得这个解决方案更像是在问题上贴上创可贴,而不是真正解决问题。但它的外观看起来很有效,所以我会选择它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2018-01-30
        相关资源
        最近更新 更多