2010-01-20 2 views
0

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

Есть ли способ избежать этого?

Можем ли мы использовать многопоточность, чтобы этого избежать?

ответ

1

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

Здесь находится учебник «двойной буферизации с Java»: Double Buffering and Page Flipping.

Многопоточность в одиночку не решить эту проблему ...

+0

Я только что слышал об этом .., чтобы избежать мерцания. Но я не знаю, как его реализовать. Можете ли вы предложить мне, как мне реализовать его в java? –

+0

Используйте ссылку, которую я разместил :-) –

1

когда вы перекрашивать, вы бы очищая весь холст перед перекройки, которая появляется как мерцание. если вы можете очистить только предыдущие нарисованные части холста, наложив одинаковые формы на цвет фона, вы можете избежать мерцания. это всего лишь одно возможное решение.

2

Отъезд this tutorial, в котором объясняется, как использовать режим ускоренной графики и двойную буферизацию, чтобы избежать мерцания экрана. Ключевым понятием является создание BufferStrategy для управления двойной буферизации:

// create the buffering strategy which will allow AWT 
// to manage our accelerated graphics 
createBufferStrategy(2); 
strategy = getBufferStrategy(); 

Затем, во время рендеринга вы получите графический объект из буфера стратегии, выполнить рендеринг с использованием Graphics и затем вызвать strategy.show().

// Get hold of a graphics context for the accelerated 
// surface and blank it out 
Graphics2D g = (Graphics2D) strategy.getDrawGraphics(); 
g.setColor(Color.black); 
g.fillRect(0,0,800,600); 

g.dispose(); 
strategy.show(); 
1

метод, который может быть использован для уменьшения мерцания экрана в анимации заключается в использовании double buffering. Двойная буферизация достигается за счет назначения вне экрана, на котором выполняются операции рисования, и только когда готовый к отображению экранный чертеж будет отображен на физическом экране.

Многопоточность не является решением, так как GUI управляется одним потоком как в AWT, так и в Swing.

-1

Убедитесь, что вы рисуете на EDT. Экземпляр javax.swing.Timer делает это простым, поскольку обработчик события действия выполняется на EDT. Я не вижу мерцания со стратегией буфера по умолчанию, даже при высоких частотах кадров, как видно here.

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