Холст: двойная буферизация

57
6

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

Поэтому я создаю стратегию двойного буфера на Canvas. Я предполагаю, что я strategy.getDrawGraphics() возвращает текущий задний буфер (буфер для рисования). Чем я рисую некоторые вещи в буфере. Теперь я предполагаю, что strategy.show() переворачивает задний буфер с передним буфером, так что задний буфер отображается на экране. Но я не вижу черный прямоугольник, когда запускаю следующий код:

final JFrame frame = new JFrame();
frame.setSize(800, 600);
frame.setVisible(true);

final Canvas canvas = new Canvas();
frame.add(canvas);

// Double Buffering
canvas.createBufferStrategy(2);
final BufferStrategy strategy = canvas.getBufferStrategy();

Graphics2D current = (Graphics2D) strategy.getDrawGraphics();
current.setColor(Color.BLACK);
current.fillRect(0, 0, 800, 600);
strategy.show(); // flip back buffer with front buffer?
current.dispose();
Toolkit.getDefaultToolkit().sync();

Thread.sleep(1000);
frame.dispose();

спросил(а) 2013-11-26T02:57:00+04:00 6 лет, 10 месяцев назад
1
Решение
69

Три вещи...

Вам следует избегать смешивания тяжелых и легких компонентов (добавление Canvas к JFrame) Вам следует избегать использования Thread.sleep, длинных циклов или методов блокировки вызовов (например, ввода-вывода) в контексте потока диспетчеризации событий. Это может помешать рисованию приложения (среди прочего). Вместо этого вы должны подумать о том, чтобы использовать что-то вроде javax.swing.Timer, который будет спать в фоновом потоке, но будет запущен в контексте потока диспетчеризации событий По умолчанию компоненты Swing имеют двойной буфер.

Взгляни на...

Больше подробностей

ответил(а) 2013-11-26T03:14:00+04:00 6 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема