Android 将信息传递给渲染器
在我的Android 将信息传递给渲染器,android,multithreading,libgdx,Android,Multithreading,Libgdx,在我的libgdx应用程序中,我有一个渲染器: @Override public void render() { if (mUpdate) { update(); } . . . } update调用将更改数组,该数组保存在render中后续调用中使用的对象 我的应用程序在create中禁用连续渲染: Gdx.graphics.setContinuousRendering(false); 每次我希望调用update时,我都会从UI线程(由用户
libgdx
应用程序中,我有一个渲染器
:
@Override
public void render() {
if (mUpdate) {
update();
}
.
.
.
}
update
调用将更改数组,该数组保存在render
中后续调用中使用的对象
我的应用程序在create
中禁用连续渲染:
Gdx.graphics.setContinuousRendering(false);
每次我希望调用update
时,我都会从UI线程(由用户操作触发)设置mUpdate=true
,并请求呈现:
public void invalidate(boolean update) {
mUpdate = update;
Gdx.graphics.requestRendering();
}
现在的问题是,invalidate(false)
可能被非用户操作隐式调用,而非用户操作又可能设置mUpdate=false
。这导致永远不会调用update
(但我们将有2个requestRendering
)
我的最佳解决方案是什么?我应该使用AtomicInteger
计数器来确保update
总是在我的render
调用中被调用吗
public void invalidate(boolean update) {
if (update) {
mUpdateCounter.getAndIncrement();
}
Gdx.graphics.requestRendering();
}
然后
@Override
public void render() {
if (mUpdateCounter.get() > 0) {
update();
mUpdateCounter.getAndDecrement();
}
.
.
.
}
或者如果可以通过调用
渲染器传递实例信息(mUpdate
)。您可以在无效(布尔值)
方法中直接调用update:
if (update)
update();
如果需要渲染线程,可以使用Gdx.app.postRunnable()
:
我不明白你为什么需要mUpdate。您是否调用过Gdx.graphics.requestRendering()代码>而不想调用update()
?如果没有Gdx.graphics.requestRendering(),则不会调用render()
方法
那么为什么需要mUpdate来防止update()
?update()是一个缓慢的调用,它会处理一些数据结构(我需要在render调用中执行)。但我不想每次都这样做,因为某些对象动画(翻译)不需要这样做。有时我会调用render并将mUpdate=false设置为yes。您可以在invalidate(boolean)
方法中直接调用update:if(update)update()
。当需要渲染线程时,使用Gdx.app.postRunnable()
Gdx.app.postRunnable()听起来是个不错的解决方案。我会试试的。莫丘用你最后的答案回答我的问题,我会接受的。
if (update) {
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
update();
}
});
}