2015-03-01 3 views
0

Я поместил этот код вместе на множество примеров, которые я нашел здесь, в stackoverflow. Когда я запускаю программу, весь экран сильно мерцает. Я уверен, что есть что-то простое, о чем я забываю, но пока не удалось найти решение. Я отлаживал это в течение пары часов в основном с помощью онлайн-чтения, поэтому я решил, что пришло время спросить аудиторию.BufferStrategy в оконном режиме вызывает постоянное интенсивное мерцание белого экрана

общественного класса Screen расширяет JComponent {

@Override 
    public Dimension getPreferredSize(){ 
     Dimension tempDimension = Toolkit.getDefaultToolkit().getScreenSize(); 
     return tempDimension; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 

     super.paintComponent(g); 
     Graphics2D g2D = (Graphics2D)bufferStrategy.getDrawGraphics(); 
     g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //sprites overlap instead of overwrite 
     if(game==null){ 
      drawSplash(g2D); 
     }else{ 
      drawBoard(g2D); 
     } 
     g2D.dispose(); 
     bufferStrategy.show(); 
    } 
} 

Если требуется какой-либо дополнительный код, я могу предоставить. Благодарим вас за помощь, stackoverflow!

+0

Вы смешиваете два системы окраски, пассивная (с двойной буферизацией) система качания и система прямой окраски BufferStrategy. Не делайте этого, выбирайте тот или другой – MadProgrammer

ответ

0

Для достижения результатов, которые вы получаете, у вас либо есть другой класс, который простирается от Canvas, либо использует BufferStrategy из контейнера верхнего уровня. В любом случае оба должны быть видимыми на экране.

В основном, они борются друг с другом, поскольку они представляют собой два разных алгоритма окраски. Swing, который является алгоритмом пассивной графики, рисует обновления по мере необходимости и BufferStrategy, который использует активный алгоритм, требуя, чтобы вы планировали обновление буфера по мере необходимости.

Оба используют алгоритм двойной буферизации.

Таким образом, вы должны выбрать один или другой ...

public class Screen extends JComponent { 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(200, 200); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 

     super.paintComponent(g); 
     Graphics2D g2D = (Graphics2D) g.create(); 
     g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //sprites overlap instead of overwrite 
     if (game == null) { 
      drawSplash(g2D); 
     } else { 
      drawBoard(g2D); 
     } 
     g2D.dispose(); 
    } 
} 

или что-то вроде ...

public void gameEngine(BufferStrategy strategy) { 

    // Main loop 
    while (!done) { 
     // Prepare for rendering the next frame 
     // ... 

     // Render single frame 
     do { 
      // The following loop ensures that the contents of the drawing buffer 
      // are consistent in case the underlying surface was recreated 
      do { 
       // Get a new graphics context every time through the loop 
       // to make sure the strategy is validated 
       Graphics2D g2D = (Graphics2D) strategy.getDrawGraphics(); 

       // Render to graphics 
       g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //sprites overlap instead of overwrite 
       if (game == null) { 
        drawSplash(g2D); 
       } else { 
        drawBoard(g2D); 
       } 
       // Dispose the graphics 
       g2D.dispose(); 

       // Repeat the rendering if the drawing buffer contents 
       // were restored 
      } while (strategy.contentsRestored()); 

      // Display the buffer 
      strategy.show(); 

      // Repeat the rendering if the drawing buffer was lost 
     } while (strategy.contentsLost()); 
    } 
} 

Который был в значительной степени сорвал с JavaDocs for BufferStrategy

BTW, это ...

@Override 
public Dimension getPreferredSize(){ 
    Dimension tempDimension = Toolkit.getDefaultToolkit().getScreenSize(); 
    return tempDimension; 
} 

- очень плохой дизайн, вы делаете предположения о состоянии компонента, который может не соответствовать действительности. Вы должны разрешить окну решать, насколько он в конечном итоге будет нужен, чего можно достичь, используя setExtendedState и передав его JFrame.MAXIMIZED_BOTH, в котором будут учтены другие элементы ОС, такие как панель задач или док-станция.

+0

Большое вам спасибо! Я был немного в своей голове со всем этим графическим материалом, но это действительно прояснило меня для меня! – Orange

Смежные вопросы