libgdx 非连续渲染

libgdx non continous rendering

根据文档 (https://github.com/libgdx/libgdx/wiki/Continuous-&-non-continuous-rendering),应该可以限制进行的渲染调用。然而,每次我移动鼠标时,渲染方法仍然被调用。我想知道是否可以将渲染限制为仅在某些 action 发生时才进行(或按需,通过添加必要的 requestRendering )。

在下面的示例中,我将连续渲染设置为 false,并在舞台上调用 setActionsRequestRendering 将其设置为 false。


public class TestApp extends ApplicationAdapter {

    private Stage stage;

    private Drawable createDrawable(Color color) {

        Pixmap labelColor = new Pixmap(100, 100, Pixmap.Format.RGB888);
        labelColor.setColor(color);
        labelColor.fill();

        return new TextureRegionDrawable(new Texture(labelColor));
    }

    @Override
    public void create() {      

        Gdx.graphics.setContinuousRendering(false);

        stage = new Stage();
        stage.setActionsRequestRendering(false);

        Gdx.input.setInputProcessor(stage);

        Drawable imageUp = createDrawable(Color.WHITE);
        Drawable imageOver = createDrawable(Color.RED);

        ImageButtonStyle style = new ImageButtonStyle();
        style.imageUp = imageUp;
        style.imageOver = imageOver;

        ImageButton button = new ImageButton(style);
        button.setSize(100, 100);
        button.setPosition(50, 50);

        stage.addActor(button);
    }

    @Override
    public void render() {

        System.out.println("render");

        Gdx.gl.glClearColor(0f, 0f, 0f, 1.f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

        stage.act();
        stage.draw();
    }

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

    public static void main (String[] arg) {

        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();

        config.fullscreen = false;
        config.width = 200;
        config.height = 200;

        new LwjglApplication(new TestApp(), config);
    }
}

根据文档:

If continuous rendering is set to false, the render() method will be called only when the following things happen.

  • An input event is triggered
  • Gdx.graphics.requestRendering() is called
  • Gdx.app.postRunnable() is called

我假设移动鼠标算作一个输入事件。


我希望仅当按钮实际需要更改其呈现状态(按钮弹起/按钮结束)时才调用渲染方法。如果那不可能,至少当鼠标位置不是 hitting 按钮时不应调用渲染。

我想这不可能是你想要的。因为每次移动鼠标时都不会调用 render() 方法,所以无法检测到悬停。

你可以做的是在渲染之前退出 render() 方法,如果你看到那个按钮没有被击中的话:

@Override
public void render() {
    stage.act();

    if(!button.isOver()){
        return;
    }

    System.out.println("Render");

    Gdx.gl.glClearColor(0f, 0f, 0f, 1.f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);


    stage.draw();
}

根据@Morchul的建议,我试试记忆状态。
感谢 @Tenfour04 指出双缓冲。

我在create方法中添加了一个InputListener:
(更改为新的全局变量/默认值:true)
(计数是另一个全局变量/默认值:0)

button.addListener(new InputListener() {

    public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
        changed = true;
        count = 0;
    }

    public void exit(InputEvent event, float x, float y, int pointer, Actor toActor) {
        changed = true;
        count = 0;
    }
});

并更改了绘图方法的开头

stage.act();

if (changed == false) {
    return;
} else if (++count == 2) {
    changed = false;
}