Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по Java 2D API? Тормозит ужасно! 
:(
    Опции темы
unkis
Дата 14.3.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Ребята, есть проблема.

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

У меня уже всё получилось, я обробатываю сабытие мыши и каждый раз когда срабатывает MouseMove, я вызываю repaint()

и всё работоло хорошо до того момента пока я в метод pain() не добавли кординатную сетку.
сделал я это так:

Код

int d=38; //38 pixel bei 96 dpi = 1 Zentimeter
                float dash[] = { 1 };
                BasicStroke stroke = new BasicStroke( 1,
                  BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER,
                  1,
                  dash, 0 );
                gp.setStroke( stroke );
                for(int i=0;i<this.getWidth();i++)
                gp.drawLine(i*d,0,i*d,this.getHeight());
                for(int j = 0; j<this.getHeight();j++)
                    gp.drawLine(0,j*d,this.getWidth(),j*d);


и теперь у меня всё тормозит ужасно.

И вот вопрос, я понимаю что каждый раз java пытается перерисовать эти кординаты, на что и требутся время из-за чего и тормоза.

Так вот можно ли как-нибудь сделать несколько слоёв, к примеру координатную сетку мне надо рисовать один раз это мой BackGround это первый слой, а все остальные действия второй слой, и потом накладывать второй слой на первф и делая при этом второй слой прозрачным?
Можно ли так?

Или может можно как-то по другому, ну не верю я что java настолько медленная.


Зарания благодарен.



--------------------
www.unkis.com
PM MAIL WWW   Вверх
batigoal
Дата 14.3.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Скорее всего, метод двойной буферизации поможет улучшить производительность. Примеры есть тут:
http://javacooperation.dev.juga.ru/Bildsch...lackernRus.html
http://www.megapolis.org/internet/web_manual/web4f.html



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
unkis
Дата 14.3.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Спасибо за ответ.
А слоёв я так понял нет?
А жаль! smile


--------------------
www.unkis.com
PM MAIL WWW   Вверх
LSD
Дата 14.3.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



1. Зачем ты задаешь dash для BasicStroke, все равно у тебя идет непрерывная линия, делай так: new BasicStroke(1.0f)
2. Попробуй рисовать сетку текстурой:
Код
BufferedImage img = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
//Заполняем сетку
TexturePaint gridPaint = new TexturePaint(img, new Rectangle(0, 0, img.getWidth(), img.getHeight()));
...
  public void paint(Graphics g)
  {
    Graphics2D g2 = (Graphics2D) g;
    g2.setPaint(gridPaint);
    g2.fillRect(0, 0, width, height);
  }



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
unkis
Дата 14.3.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Цитата(Lamer George @ 14.3.2006, 15:56)
Скорее всего, метод двойной буферизации поможет улучшить производительность. Примеры есть тут:
http://javacooperation.dev.juga.ru/Bildsch...lackernRus.html
http://www.megapolis.org/internet/web_manual/web4f.html

что-то я не совсем с DoubleBuffered разобрался.
я патаюсь сделать так:

Код

public class Ebene extends JPanel implements MouseListener, MouseMotionListener{

        
        private int d=38; //38 pixel bei 96 dpi = 1 Zentimeter
        Graphics offscreenGraphics;
        Image offscreenImage;
        
        public Ebene()
        {
            offscreenImage = createImage( this.getWidth(), this.getHeight() );
            offscreenGraphics = offscreenImage.getGraphics();
            this.setDoubleBuffered(true);
            setBackground(Color.white);
            addMouseMotionListener(this);
            addMouseListener(this);
            createCordinats();
        }
......
......
......
 private void createCordinats() {
            
             int screenWidth = this.getWidth();
             int screenHeigth = this.getHeight();
                for(int i=0;i<screenWidth;i++)
                offscreenGraphics.drawLine(i*d,0,i*d,screenHeigth);
                for(int j = 0; j<screenHeigth;j++)
                    offscreenGraphics.drawLine(0,j*d,screenWidth,j*d);
                        
            }
public void paint(Graphics g) {
             
                
                        
                int np = ebene.size();
                Graphics2D gp = (Graphics2D) g;
                gp.clearRect(0,0,this.getWidth()-1,this.getHeight()-1);
                gp.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
                         RenderingHints.VALUE_ANTIALIAS_ON);
                
                //this.setDoubleBuffered(true);
                
                /* draw the current lines*/ 
                gp.setColor(getForeground());
                //createCordinats(gp);
                 if ( offscreenImage != null )
                        gp.drawImage( offscreenImage, 0, 0, this );
......
.....
}


и у меня выдаёт ошибку
Код

Exception in thread "main" java.lang.NullPointerException
    at grundrisse.Ebene.<init>(Ebene.java:33)
    at grundrisse.MainApp.<init>(MainApp.java:24)
    at grundrisse.MainApp.main(MainApp.java:53)


ошибку выбрасывает в конструкторе на этой строчке
Код

offscreenGraphics = offscreenImage.getGraphics();


Ребята что я делаю не так?

Зарания благодарен.


--------------------
www.unkis.com
PM MAIL WWW   Вверх
batigoal
Дата 14.3.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Документация на метод createImage() говорит, что
Цитата

Returns:
an off-screen drawable image, which can be used for double buffering. The return value may be null if the component is not displayable. This will always happen if GraphicsEnvironment.isHeadless() returns true.

Добавлено @ 20:15
Если делать вместо createImage() --> new BufferedImage(...), то не вылетает, но рисуется сплошной черный квадрат.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
unkis
Дата 14.3.2006, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Цитата(Lamer George @ 14.3.2006, 20:08)
Документация на метод createImage() говорит, что
Цитата

Returns:
an off-screen drawable image, which can be used for double buffering. The return value may be null if the component is not displayable. This will always happen if GraphicsEnvironment.isHeadless() returns true.

Добавлено @ 20:15
Если делать вместо createImage() --> new BufferedImage(...), то не вылетает, но рисуется сплошной черный квадрат.

Это всй хорошо, только что мне делать.

Подскажите пожалуйста, я что - то ничего не пойму.


--------------------
www.unkis.com
PM MAIL WWW   Вверх
unkis
Дата 15.3.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Вопрос решён! Всем спасибо.
Праблема была в том что
Код

offscreenImage = createImage( this.getWidth(), this.getHeight() );
            offscreenGraphics = offscreenImage.getGraphics();


в конструкторе возвращали 0.

не понятно почему может кто сможет обяснить этот феномен.


--------------------
www.unkis.com
PM MAIL WWW   Вверх
LSD
Дата 15.3.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(unkis @ 15.3.2006, 11:04 Найти цитируемый пост)
в конструкторе возвращали 0.

не понятно почему может кто сможет обяснить этот феномен.

Потому что до того как контейнер будет отображен на экране LayoutManager не вызывается и все компоненты имеют умолчальный размер 0.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 15.3.2006, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(unkis @ 15.3.2006, 12:04 Найти цитируемый пост)
Вопрос решён! Всем спасибо.
Праблема была в том что в конструкторе возвращали 0.
не понятно почему может кто сможет обяснить этот феномен.

Потому что на момент вызова метода панелька еще не отображена, поэтому и нули.
Но я пробовал втупую забивать туда (50, 50), и все равно не желало.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.