2015-08-14 2 views
0

Я новичок в графике Java, поэтому мало объяснений было бы полезно.Java Doublebuffer - Почему мы очищаем открытую область?

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

Похоже, мы загрузили его графикой, и сразу после этого мы его очистили? Но почему? (3-й кодовый блок)

Любое объяснение о нем и за его пределами было бы полезно.

class DoubleBufferedCanvas extends Canvas { 

    public void update(Graphics g) { 
     Graphics offgc; 
     Image offscreen = null; 
     Dimension d = size(); 

     // create the offscreen buffer and associated Graphics 
     offscreen = createImage(d.width, d.height); 
     offgc = offscreen.getGraphics(); 

     // clear the exposed area ----------- T H I S B L O C K -------- 
     offgc.setColor(getBackground()); 
     offgc.fillRect(0, 0, d.width, d.height); 
     offgc.setColor(getForeground()); 

     // do normal redraw 
     paint(offgc); 
     // transfer offscreen to window 
     g.drawImage(offscreen, 0, 0, this); 
    } 
} 

ответ

1

Поскольку все, что когда-либо ранее было нарисовано на экране, все равно будет там.

Прежде всего, это не свинг, это AWT

Try и думать об этом, как это. В Swing (и многих других графических фреймворках) работают как самый искусный холст, где все, что когда-либо было нарисовано на нем, все равно останется, если вы сначала не нарисуете его.

Давайте поближе рассмотрим код ...

// Reference to the image's Graphics context 
Graphics offgc; 
// Backing image 
Image offscreen = null; 
// Current size of the component 
Dimension d = size(); 

// create the offscreen buffer and associated Graphics 
offscreen = createImage(d.width, d.height); 
// Get a reference to the backing buffer's Graphics context 
offgc = offscreen.getGraphics(); 

// The image has a default color (black I think), so we 
// fill it with components current background color 
// clear the exposed area ----------- T H I S B L O C K -------- 
offgc.setColor(getBackground()); 
offgc.fillRect(0, 0, d.width, d.height); 
// Set the default color to the foreground color 
offgc.setColor(getForeground()); 

// do normal redraw 
paint(offgc); 
// transfer offscreen to window 
g.drawImage(offscreen, 0, 0, this); 

Теперь, вполне возможно, что это просто не требуется, так как одна из вещей, метод paint будет пытаться сделать это заполнить Graphics контекст с самим цветом фона. Кроме того, вместо вызова paint(offgc);, код, вероятно, следует называть super.update(offgc); вместо ...

Я также предлагаю не потрудившись с snipet и вместо того, чтобы сосредоточиться на использовании компонентов Swing, которые уже дважды буферизованные или с использованием BufferStrategy и BufferStrategy and BufferCapabilities если вы хотите взять под контроль процесс рисования в целом.

Кроме того, посмотрите на Painting in AWT and Swing и Performing Custom Painting для получения более подробной информации о том, как работает живописи в AWT и свинг

+0

спасибо за объяснение, но я до сих пор не ясно, о точке: я думаю, offgc.fillRect (0, 0, d.width, d.height); работает, как будто мы заполняем весь прямоугольник указанным цветом, но не содержимым графических изображений. они остаются нетронутыми (вид заполняет фон с определенным цветом). Я прав? и что нужно использовать offgc.fillRect (0, 0, d.width, d.height); – nikoloz

+0

Нет, не совсем. «Графика» - это просто средство, позволяющее рисовать пиксели цели (в данном случае изображение и экран), это всего лишь объединенный API. Поэтому, когда вы вызываете 'fillRect', на самом деле это рисование/заполнение пикселей в целевом объекте. В этом цель состоит в том, чтобы сделать изображение заполненным цветом фона. Как я уже сказал, я считаю, что 'createImage' создает изображение с черным фоном, которое не особенно красиво – MadProgrammer

+0

ok. поэтому я создаю пустое изображение с размером (100px; 100px), все из 1000 пикселей которого являются «свободными». затем я вызываю getGraphics на этом изображении, -> рисунки рисуются на нем, заполняя («занимая») (например) 100 пикселей из 1000. next - если я использую fillRect, оставшиеся 900 пикселей будут заполнены указанным цветом. – nikoloz

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