我使用libgdx制作简单的游戏。我想在其他线程中显示精灵(不在主线程中)。但如果我跑,那就没有精灵。在我的logcat中,我看到了sprite的实例,但是图形没有显示出来。 我的代码:
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
rbg.render();
camera.update();
Thread th = new Thread(new Runnable(){
@Override
public void run() {
Gdx.app.postRunnable(new Runnable(){
@Override
public void run() {
camera.update();
batch.getProjectionMatrix();
pokazPostac();
}
});
}
});
th.start();
}
public void pokazPostac(){
Random r = new Random();
batch.setProjectionMatrix(camera.combined);
spriteb.setSize(64, 100);
batch.begin();
switch (r.nextInt(6)){
case 0:
spriteb.setPosition(64, 128);
spriteb.draw(batch);
Gdx.app.log("", ""+spriteb.getX());
break;
case 1:
spriteb.draw(batch);
spriteb.setPosition(192, 256);
break;
case 2:
spriteb.draw(batch);
spriteb.setPosition(320, 128);
break;
case 3:
spriteb.draw(batch);
spriteb.setPosition(448, 256);
break;
case 4:
spriteb.draw(batch);
spriteb.setPosition(640, 128);
break;
case 5:
spriteb.draw(batch);
spriteb.setPosition(704, 256);
break;
}
batch.end();
}
答案 0 :(得分:3)
因为您将其标记为OpenGL,所以您应该记住OpenGL是单线程,除了可能的一些新功能之外,多线程渲染被视为错误。
所以通常你创建一个窗口,为它分配OpenGL,然后就可以调用OpenGL函数了。因此,如果这些步骤中的任何一个在不同的线程中完成,则很可能会失败。所以基本上当你创建一个上下文时,它只能在1个线程中当前,你可以根据需要进行切换,但这可能会导致速度减慢。因此,因为您的上下文在线程1中是 current ,并且您尝试从线程2调用OpenGL函数,所以这些调用将失败,因为线程2的当前上下文为none。
你可以做的是,你可以更新你想要的地方,例如在单独的线程中执行“physics”并将这些更改提交到渲染线程中,但即使在这种情况下,你也必须从创建窗口的同一个线程中渲染+初始化OpenGL或只是简单地坚持单线程设计。