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;
}
根据文档 (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;
}