Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ускорение анимации рисования 
:(
    Опции темы
Mifody
Дата 28.9.2011, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем доброго времени суток.
Требуется анимировать работу станка, точнее процесс реза делатей лазерным станком с ЧПУ. Если кто знаком с перьевыми плоттерами - принцип работы аналогичный. Есть плита по ней бегает лазерная головка и вырезает детали.
Исходные данные - массив координатных параметров объектов (линия, дуга, окружность). Размерность масиива порядка 30 000 элементов (это то, что я уже видел, может быть и больше).
Для рисования использую PaintBox в связке с GDI+. Все рисуется на TGPBitmap с использованием трансформации рисования и он потом устанавливается на канву.

На данный момент, алгоритм работы с масивом и переменые следующие.
переменные -  есть счетчики "элемент массива" - cI, "итерация элемена массива" - cCurr, "на сколько итераций разбит элемент массива" - cMax - ну и несколько переменных для хранения приращения координат, что бы их вычислять только один раз
алгоритм, работа алгоритма повешена на таймер
1. если cMax = -1 (у меня это означает, что еще не просчитан элемент масиива), вычисляются параметры элемента (количестов участков, на сколько разбивать; приращение координат и прочее), и рисуется первый участок (кусочек линии или дуги)
2. если cMax > 0 и cCurr < cMax, тогда рисуем следующий участок

Собственно сама проблема: очень маленькая скорость рисования и дикое потребление ресурсов протца. 

Есть подозрение, что проблема в мольшом количестве шагов рисования (каждый участок обычно разбивается на более чем 5 участков)
Может кто подсказать в какую сторону двигаться? Код оптимизировать (исходники, по необходимости, выложу)? Само рисование переписывать? Или вообще в OpenGL/DirectX уходить?

UPD: 
Перечитал и понял, слишком много буквоф. Если в кратце - мне необходимо анимированно построить след от движения инструмента. Вроде как двигаеш карандаш по бумаге, за ним тянется линия.

Это сообщение отредактировал(а) Mifody - 28.9.2011, 14:39
PM MAIL WWW   Вверх
Antimol
Дата 29.9.2011, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 28.7.2007
Где: Украина, Киев

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



Определи в каких участках кода процессор загружен больше всего. Также можешь воспользоваться функцией GetTickCount для определения времени выполнения той или иной функции.
Нужно смотреть код и разбираться в чем же причина.
--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
Mifody
Дата 29.9.2011, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Процессор сильно нагружает прорисовка экрана. Почему так думаю? Потомы, что при выполнении всего кода в памяти и одной прорисовки (отображение только результата) время (без замера, сугубо предвзято) секунд 5-10. При постоянной прорисовке... скажем так, минут через 10 надоело ждать. Понятное дело, что перевыводить всю картинку не есть хорошо, вот и пытаюсь понять в какую сторону двигаться.

Предвидя предложение: "создавай маленькие участки, и их выводи" - у меня могут быть участки с паралельными линиями, допустим, 45 градусов. Эти линии рисуются - первая в начале, вторая в конце. Как тогда поступать?

А тут еще приперло определять по какому участку линии щелчек мыши был... Похоже прийдется от TCanvas уходить вообще
PM MAIL WWW   Вверх
Proxin
Дата 1.10.2011, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



delphix - хорошая бесплатная библиотека, попробуй использовать её. представляет собой маленький directx, всё просто и логически понятно.

Это сообщение отредактировал(а) Proxin - 1.10.2011, 11:22
PM MAIL   Вверх
CROTishka
Дата 25.10.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



2D графика любой сложности не должна тормозить. (даже если вы не напрямую через GDI рисуете, а через канву) Если она тормозит, значит что-то вы делаете неправильно. Единственное, что может действительно тормозить, это если у вас 1000 надписей по экрану "летают"(Вывод текста сильно больше отъедает , чем линии рисовать). 
Не берите пример с  "GIS ГЕО кибернетика".  smile 
Берите пример с PMetro.  smile 

Это сообщение отредактировал(а) CROTishka - 25.10.2011, 11:12
PM MAIL   Вверх
Antimol
Дата 25.10.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 28.7.2007
Где: Украина, Киев

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




А пересчёт каждый раз идет при перерисовке?
--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
Mifody
Дата 25.10.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пересчета нет как такового. Да уже и исходников нет как таковый, вопрос на данный момент не актуален. Решил конкретно эту задачу с помощью GLScene, там правда косяк вылез с максимальным количеством элементов...

Если развивать конкретно этот вопрос:
1. массив параметров элементов (тип - дуга/линия, координаты, вспомогательные переменные)
2. расчет основоной идет один раз на элемент
3. при последующих обращениях к элементам, вычисления элементарные +/-, и всего штуки две/три  (к примеру линию длиной 500 точек разбиваем на участки по 10 точек, и добавляем каждый участок по таймеру для эффекта анимации)

вот и все.
Практически на 100% уверен что проблема на самом деле именно в обновлении формы (Redraw или как он там правильно называется), если запретить прорисовку экрана, то, по идее намного быстрее будет. Но тогда анимация исчезнет.

Если решение этого вопроса актуально для кого, и понадобятся исходники - могу выдернуть сырцы, я в репозитарии вроде как их сохранил
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




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


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

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