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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мигающий полигон, Как сделать правильно? 
V
    Опции темы
Su_
Дата 8.6.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день!

Как сделать корректно мигающий полигон или квадрат .

Я пускаю поток, который каждую 2 секунду обрисовывает тот же полигон только другого цвета , получается что надо. 
в 1 секунду полигон -красный , во 2 - синий , и так в цикле .. 
Код

if(drawing==1)
           {
                     gr.setColor(Color.RED);
                 preview_sectors(global_count_polygon);
                     drawing=2;
             
           }else if(drawing==2)
           {
              gr.setColor(Color.BLUE);
              preview_sectors(global_count_polygon);
              drawing=1;
           }

метод preview_sector просто рисует полигон..

Получается что они накладываются друг на друга .. Вроде как сборщик мусор работает и память особо не забивает.

Есть какой-нибудь способ по красивее?


--------------------
user posted image

PM MAIL WWW   Вверх
pathfinder
Дата 8.6.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 7
Всего: 10



1) Заместо потока использовать таймер.
2) Заместо if - else - if использовать это

Код

drawInRed = !drawInRed; // boolean

gr.setColor(drawInRead ? Color.RED : Color.BLUE);
preview_sectors(global_count_polygon);

PM MAIL   Вверх
Su_
Дата 8.6.2010, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо перепишу у себя.Но по сути это другая интерпретация моего метода..  Я боюсь что в нем может быть утечка памяти ,  т.к. мы рисуем поверх , не удаляя старое


preview_sectors:
Код

 Polygon p = new Polygon();
     int counts_board=0;
     int zone=0;
     counts_board=JBoard4.getRowCount();
     for(int i=counts_board-1;i>=0;i--)
     {
String x_c=""+JBoard4.getValueAt(i,2);
String y_c=""+JBoard4.getValueAt(i,3);
zone = Integer.parseInt(""+JBoard4.getValueAt(i,0));
int x,y=0;
x=Integer.parseInt(x_c);
y=Integer.parseInt(y_c);
//gr.drawOval(x-(x_height/2), y-(y_height/2),x_height, y_height);

 if (zone==num_polygon)
 {
       gr.drawPolygon(p);
        gr.fillPolygon(p);
       p.reset();
       num_polygon++;
 }
 p.addPoint(x,y);
     }
         gr.drawPolygon(p);
 gr.fillPolygon(p);
       p.reset();
      // gr=(Graphics2D)g;
    
     }



--------------------
user posted image

PM MAIL WWW   Вверх
pathfinder
Дата 8.6.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 7
Всего: 10



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

PM MAIL   Вверх
Su_
Дата 8.6.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как скажется? т.е. из чего может пострадать скорость работы программы , если не от недостатка оперативной памяти?


--------------------
user posted image

PM MAIL WWW   Вверх
pathfinder
Дата 8.6.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 7
Всего: 10



Отрисовка вся производится в экранный буфер суть прямоугольный массив(при этом Graphics отвечает за то что-бы пикселы выходящие за текущий прямоугольник отсечения не отрисовывались). Поэтому отрисовка скажем 100 одинаковых квадратов размером 500х500 пикселов будет эквивалентна по скорости отрисовки одного квадрата 5000х5000 пикселов. При этом чем сложнее фигуры(например полигоны) тем больше "сил" будет тратится на то, что-бы отрисовать ту часть фигуры, что помещается в прямоугольник отсечения(Clip rect).
PM MAIL   Вверх
Su_
Дата 8.6.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ясно, а что будет происходить когда один квадрат накладывается на другой , и так до бесконечности ... Как я понимаю при накладывание он автоматически будет освобождать то что находится под?)


--------------------
user posted image

PM MAIL WWW   Вверх
pathfinder
Дата 8.6.2010, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 7
Всего: 10



Graphics при отрисовке примитивов(прямых, овалов, прямоугольников и тп) не сохраняет их.

Т.е. 

Polygon somePolygon = ...;

graphics.fillPolygon(somePolygon);
// somePolygon прорисовался на экранном буфере, сам полигон нигде внутри graphics не сохранился
// каковы бы ни были затраты на прорисовку они уже затратились

graphics.fillPolygon(somePolygon);
// еще раз тот же самый полигон отрисовываем, итогом чего просто стало повторная прорисовка одних и тех же пикселей.

т.е по факту такой код по эффективности равно значен этому

Код

// это бесполезная работа
for (int i=0; i<unneededCicleCount; i++) {
  
  // это полезная работа, отрисовка полигона
  for (j =0; j<...; j<...) {
      pixelArray[j] = polygon.getNextPixel();
  }

}


Операции отрисовки можно приближенно представить себе как операции присваивания значений цвета 
элементам двухмерному прямоугольному массиву:

graphics.setColor(color);
graphics.fillRect(x, y, width, height);

заполняем элементы массива примерно вот так
for (int i=x; i<x+width; i++) {
   for (int j=y; j<y+height; j++) {
       screenBuffer[i][j] = currentColor;
   }
}


PM MAIL   Вверх
Su_
  Дата 8.6.2010, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо большое за подробный ответ, теперь до конца понял как это происходит.! !!!



--------------------
user posted image

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

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

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


 




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


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

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