2013-05-30 2 views
3

Я работаю над проектом генерации лабиринтов с использованием Java, swing и Java2D. Я довольно новичок в Java2D, поэтому, пожалуйста, извините меня, если этот вопрос является новичком.Лучший способ избежать перерисовки всего лабиринта?

В принципе, у меня есть успешно сгенерированный лабиринт. Я хочу нарисовать этот лабиринт на пользовательском JPanel, который я настроил и правильно переопределил PaintComponent. Проблема, которую я сейчас имею, заключается в том, что у меня есть способность рисовать лабиринт, но каждый раз, когда я перерисовываю ее, она исчезает. Я решил это, перерисовывая лабиринт каждый раз, когда вызывается repaint(), но это кажется ужасно неэффективным. Поскольку лабиринт не меняется, зачем мне его перерисовывать?

Итак, мой вопрос заключается в следующем: есть ли способ «кэшировать» рисунок лабиринта, поэтому мне не нужно тратить циклы, перерисовывая его каждый раз? Я могу видеть его перерисовку каждый раз, когда исключительно большие лабиринты являются основным источником замедлений.

Спасибо!

+0

Если рисование в 'paintComponent' с двойной двойной буферизацией' super.PaintComponent' не должно давать эффекты краски. Не много создания или других дорогостоящих операций при рисовании, а не «перекрашивать» в paintComponent. Меньше repaints, 'repaint (50L)' лучше. –

ответ

3

Нарисуйте лабиринт в BufferedImage. Затем в вашем методе paintComponent() просто нарисуйте BufferedImage. Свинг определит, нужно ли перекрасить весь лабиринт или просто его части.

Для иллюстрации рисунка на BufferedImage см. Пример DrawOnImage от Custom Painting Approaches.

0

Если лабиринт никогда не меняется, вы можете нарисовать его в BufferedImage. Вы можете использовать тот же самый код, который вы написали для переопределения paintComponent, создав BufferedImage и позвонив image.createGraphics(), чтобы получить объект Graphics2D. Любая картина, которую вы делаете с объектом Graphics2D, возвращена с createGraphics(), добавляется в BufferedImage. Возможно, вам придется извлечь свой предыдущий код чертежа только для лабиринта в его собственную функцию, которая принимает объект Graphics2D и рисует на нем.

После того, как вы ваш лабиринт вовлекается в BufferedImage, вы можете использовать любой из drawImage() функций в Graphics или Graphics2D. Это позволяет избежать перерисовывания лабиринта: теперь вы просто рисуете уже визуализированное изображение.

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