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();
        }
    });
}