libgdx非连续渲染

时间:2019-06-28 09:30:31

标签: java libgdx

根据文档(https://github.com/libgdx/libgdx/wiki/Continuous-&-non-continuous-rendering),应该可以限制进行的渲染调用。但是,每次我移动鼠标时,render方法仍然会被调用。我想知道是否有可能将渲染限制为仅在某些action发生时(或根据需要通过添加necesarry 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);
    }
}

根据文档:

  

如果连续渲染设置为false,则render()方法将为   仅在发生以下情况时调用。

     
      
  • 触发输入事件
  •   
  • Gdx.graphics.requestRendering()被称为
  •   
  • Gdx.app.postRunnable()被称为
  •   

我认为移动鼠标算作输入事件。


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


编辑2:

根据Morchul的建议,我会尝试记住该状态。

感谢Tenfour04指出双重缓冲。

我在create方法中添加了一个InputListener:
(已更改为新的全局变量/默认值:true)
(count是另一个全局变量/默认值: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;
            }
        });

并更改了draw方法的开始

        stage.act();

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

2 个答案:

答案 0 :(得分:2)

我认为您不可能想要什么。因为没有在每次移动鼠标时都调用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();
}

答案 1 :(得分:0)

根据@Morchul的建议,我会尝试记住该状态。
感谢@Tenfour04指出双重缓冲。

我在create方法中添加了一个InputListener:
(已更改为新的全局变量/默认值:true)
(count是另一个全局变量/默认值: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;
    }
});

并更改了draw方法的开始

stage.act();

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