将信息传递给渲染器

时间:2018-09-03 07:38:07

标签: android multithreading libgdx

在我的libgdx应用中,我有一个renderer

@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。这导致requestRendering永远不会被调用(但是我们将有2 x 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

或者是否有可能在每个renderer调用中传递实例信息(public class Test1 extends AppCompatActivity { ListView listView; String[] fruitNames = {"Apple","Orange","Kiwi","Passion","Banana"}; int[] fruitImages = {R.drawable.ic_chevron_right,R.drawable.ic_chevron_right,R.drawable.ic_chevron_right,R.drawable.ic_chevron_right,R.drawable.ic_chevron_right}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test1); )。

1 个答案:

答案 0 :(得分:1)

您可以直接通过invalidate(boolean)方法调用更新:

if (update)
    update();

如果需要渲染线程,可以使用Gdx.app.postRunnable()

if (update) {
    Gdx.app.postRunnable(new Runnable() {
        @Override
        public void run() {
            update();
        }
    });
}