不显示线程中的精灵

时间:2013-12-18 14:51:32

标签: libgdx

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

1 个答案:

答案 0 :(得分:3)

因为您将其标记为OpenGL,所以您应该记住OpenGL是单线程,除了可能的一些新功能之外,多线程渲染被视为错误。

所以通常你创建一个窗口,为它分配OpenGL,然后就可以调用OpenGL函数了。因此,如果这些步骤中的任何一个在不同的线程中完成,则很可能会失败。所以基本上当你创建一个上下文时,它只能在1个线程中当前,你可以根据需要进行切换,但这可能会导致速度减慢。因此,因为您的上下文在线程1中是 current ,并且您尝试从线程2调用OpenGL函数,所以这些调用将失败,因为线程2的当前上下文为none。

你可以做的是,你可以更新你想要的地方,例如在单独的线程中执行“physics”并将这些更改提交到渲染线程中,但即使在这种情况下,你也必须从创建窗口的同一个线程中渲染+初始化OpenGL或只是简单地坚持单线程设计。