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

Java 桌面应用程序上的libgdx屏幕闪烁,java,opengl,libgdx,Java,Opengl,Libgdx,我目前正在为我的libgdx游戏开发一个简单的加载屏幕,但是它有一个问题。加载屏幕在android项目上工作正常,但在桌面版本上却无法正常工作。当前加载屏幕应显示“加载”->“加载”。->“加载..”->“加载…”,间隔1秒,然后重复。当我在桌面应用程序上加载游戏时,它会显示“加载”(并且它会疯狂地闪烁),然后按照预期的周期进行。在整个时间里,一切都在闪烁,好像刷新率太高了,或者什么的,它在后台显示了幻象周期,而它们本不应该出现在那里。有人能告诉我这是什么时候在桌面版而不是Android版上发生

我目前正在为我的libgdx游戏开发一个简单的加载屏幕,但是它有一个问题。加载屏幕在android项目上工作正常,但在桌面版本上却无法正常工作。当前加载屏幕应显示“加载”->“加载”。->“加载..”->“加载…”,间隔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 
    }
}
    @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()函数: 公共无效渲染(浮动增量){

Gdx.gl.glClear(GL10.gl\u颜色\u缓冲\u位);
textBatch.begin();
font.draw(textBatch,loading.substring(0,7+句点),(Gdx.graphics.getWidth()/2)-(textwidth/2),(Gdx.graphics.getHeight()/2)+(texthheight/2));
textBatch.end();
如果(updateTextTime>=0.5){//检查是否为秒
如果(周期<3){
周期+=1;
}否则{
周期=0;
}
updateTextTime=0;
}否则{
updateTextTime+=delta;//accumlate
}
}

您应该始终在
render
回调中渲染某些内容

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

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


如果不希望经常调用渲染,可以将Libgdx切换到非连续渲染模式(但需要找到一个钩子,每隔一秒左右将渲染调用重新启动)。请参阅。

您应该始终在
render
回调中渲染某些内容

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

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


如果不希望经常调用渲染,可以将Libgdx切换到非连续渲染模式(但需要找到一个钩子,每隔一秒左右将渲染调用重新启动)。请参阅。

您的答案通过每次在渲染函数中调用这3个函数来起作用。您的答案通过每次在渲染函数中调用这3个函数来起作用。
    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 
    }
}