libgdx屏幕在桌面应用程序上闪烁

时间:2013-07-06 21:09:53

标签: java opengl libgdx

我目前正在为我的libgdx游戏设计一个简单的加载屏幕,但它有一个问题。加载屏幕在android项目上完美运行,但是当涉及到桌面版本时,它无法正常工作。目前加载屏幕应显示“LOADING” - > “LOADING”。 - > “加载......” - > “加载......”,间隔1秒,然后重复。当我在桌面应用程序上加载游戏时,它会显示“正在加载”(并且它会像疯了一样闪烁),然后按照预期的那样继续进行。整个时间一切都在闪烁,就像刷新率高或者什么东西一样,并且当它们不应该存在时,它会显示背景中的幻影周期。有人能告诉我这是在桌面版本而不是Android版本上发生的吗?这里还有我的“LoadingScreen implements Screen”的两个函数的代码

渲染(浮点增量)函数:

float updateTextTime = 0;
@Override
public void render(float delta) {
    if (updateTextTime >= 1){                       //check to see if it has been a second
        if (periods == 0){
            Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);   //clears the buffer bit 
        }

        textBatch.begin();                          
        font.draw(textBatch,loading.substring(0,7+periods),(Gdx.graphics.getWidth()/2)-(textwidth/2),(Gdx.graphics.getHeight()/2)+(textheight/2));
        if (periods < 3){
            periods += 1;
        }else{
            periods = 0;
        }
        textBatch.end();
        updateTextTime = 0;
    }else{
        updateTextTime += delta;                    //accumlate 
    }
}

和show()函数:

    @Override
public void show() {
    textBatch = new SpriteBatch();
    font = new BitmapFont(Gdx.files.internal("fonts/ArmyChalk.fnt"), Gdx.files.internal("fonts/ArmyChalk.png"),false);
    if (game.AppTypeMine == ApplicationType.Android){
        font.scale(2.0f);
    }
    textwidth = font.getBounds(loading).width;
    textheight = font.getBounds(loading).height;
}

最终解决方案: 改变了render()函数:         public void render(float delta){

    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    textBatch.begin();                          
    font.draw(textBatch,loading.substring(0,7+periods),(Gdx.graphics.getWidth()/2)-(textwidth/2),(Gdx.graphics.getHeight()/2)+(textheight/2));
    textBatch.end();

    if (updateTextTime >= 0.5){                         //check to see if it has been a second
        if (periods < 3){
            periods += 1;
        }else{
            periods = 0;
        }
        updateTextTime = 0;
    }else{
        updateTextTime += delta;                    //accumlate 
    }
}

1 个答案:

答案 0 :(得分:3)

您应始终在render回调中呈现内容。

您可能看到双缓冲问题(OpenGL无法判断您没有在当前帧缓冲区中绘制任何内容,因此最终会渲染剩余的内容)。

更改您的代码,以便始终调用font.draw来电。我想您可以将textBatch.begin()font.draw()textBatch.end()调用移到初始if / else块之外。

如果您不希望经常调用渲染,可以将Libgdx切换到非连续渲染模式(但是您需要找到一个钩子,以便每隔一秒左右将渲染调用恢复生命)。请参阅http://bitiotic.com/blog/2012/10/01/enabling-non-continuous-rendering-in-libgdx/