Почему LWJGL мигает между предыдущим и текущим gameState только на Windows?

Эта проблема возникает только в Windows. Работает нормально в Linux.

У меня есть система управления состоянием на основе стека. Когда я переключаюсь из одного состояния в другое, дисплей мигает между предыдущим и текущим состояниями. Его почти как один из буферов по-прежнему отображает предыдущее состояние и чередуется с текущим состоянием.

Вот мой первый код состояния init, draw и exit:

  • init вызывается при первой загрузке состояния

  • draw называется каждый цикл

  • pause вызывается до того, как новое состояние помещается поверх стека.

        private void init()
        {
        glEnable(GL_TEXTURE_2D);
        glShadeModel(GL_SMOOTH);       
        glDisable(GL_DEPTH_TEST);
        glDisable(GL_LIGHTING);                   
    
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);               
        glClearDepth(1);                                      
    
    
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
    
        glViewport(0,0,Game.getGameConfig().getDisplayWidth(),Game.getGameConfig().getDisplayHeight());
        glMatrixMode(GL_MODELVIEW);
    
    
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0,Game.getGameConfig().getDisplayWidth(), Game.getGameConfig().getDisplayHeight(), 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);
    }
    public void draw() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    
        titleFont.drawString((Game.getGameConfig().getDisplayWidth()/2)-(titleFont.getWidth(titleText)/2),
                (Game.getGameConfig().getDisplayHeight()/2) - (titleFont.getHeight()/2) ,
                titleText,Color.orange);
    
        if(showStartText)
        {
            pressStartFont.drawString((Game.getGameConfig().getDisplayWidth()/2)-(pressStartFont.getWidth(pressStartText)/2),
                    (Game.getGameConfig().getDisplayHeight()/2) - (titleFont.getHeight() - 100),
                    pressStartText, Color.orange);
        }
    }
    
    public void pause() {
        glDisable(GL_BLEND);
        glDisable(GL_TEXTURE_2D);
    }
    

    А вот следующий игровой код штата:

    private void init()
    {
        glEnable(GL_TEXTURE_2D);
        glShadeModel(GL_SMOOTH);       
        glDisable(GL_DEPTH_TEST);
        glDisable(GL_LIGHTING);                   
    
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);               
        glClearDepth(1);                                      
    
    
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glViewport(0,0,Game.getGameConfig().getDisplayWidth(),Game.getGameConfig().getDisplayHeight    ());
            glMatrixMode(GL_MODELVIEW);
    
    
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glOrtho(0,Game.getGameConfig().getDisplayWidth(),     Game.getGameConfig().getDisplayHeight(), 0, 1, -1);
            glMatrixMode(GL_MODELVIEW);
    }
    public void draw() {
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
        mainMenu.draw();
        Display.update();
    }
        public void pause() {
        glDisable(GL_BLEND);
        glDisable(GL_TEXTURE_2D);
    
    }
    

Вот как загружается новое состояние.

Первое состояние вызывает:

super.sm.push(new MainMenu(super.sm));

Вот StateManager (sm) код:

public void push(GameState state)
{
    if(!states.empty())
    {
        states.peek().pause();
    }
    states.push(state);
    state.enter();
}

Основной игровой цикл вызывает этот метод в StateManager:

public void draw()
{
    if(!states.empty())
    {
        states.peek().draw();
    }
    Display.update();
}

Что вызывает мерцание между состояниями в Windows?

1 ответ

Решение

У тебя есть Display.update(); Как в вашем методе StateManager Draw, так и в вашем методе gameState Draw. Удалите тот, который находится в вашем игровом состоянии.

Другие вопросы по тегам