Как оптимизировать определение границ произвольной фигуры ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Как оптимизировать определение границ произвольной фигур

Сообщение pupsik » 11.02.2017 00:23:31

FreeAndNil - эт что? Таблетка от всех болезней?
Посмотрите что делают bmp.Clear и bmp.FreeImage...

п.с.
каждому куличику...
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Лекс Айрин » 11.02.2017 09:54:42

pupsik писал(а): А толку, возможно, никакого. Менять алексу надо логику программы. Иначе или лаги, или странные вопросы.


Ну, собственно, толк есть. ТС все же решил поменять, хоть частично, логику работы.
vitaly_l писал(а):Если ответ, Да, то в общем-то я прислушаюсь и буду удалять командой FreeAndNil.

Вообще-то, это мало чем отличается от Free.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как оптимизировать определение границ произвольной фигур

Сообщение olegy123 » 11.02.2017 12:23:44

FreeAndNil - желательно применять там где активно создаются и удаляются объекты, работа с указателями, или есть необходимость пересоздавать объекты..
c Free переменная не обнуляется, и указывает на мусор или зомби. И если повторно использовать переменную - легко въехать в кучу мусора получить экспешен, а можно поработать с зомби объектом - но не факт что он будет полноценно живой.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 11.02.2017 23:52:27

Ну разошлись тут без меня .. 8)
Не применено почитаю, что ту за споры шли ... но чуть позже . :idea:

А пока спешу сообщить, что мной найдена потенциально "закрывающая " вопрос технология ...
(Отдельное спасибо тов Pavia за направление поиска )


Код: Выделить всё
    BeginРath(CurCanvas .Handle);
       DrawFig(-1,DrawList[i]);//Рисую фигуру через скрипт ...
    Endpath(CurCanvas .Handle);
    // FlattenPath(CurCanvas .Handle);// неясно что делает и нужно ли мне ...
       HR:=pathToRegion(CurCanvas .Handle); // !!!!!
       GetRgnBox(Hr,R);  // R искомый TRect
       DeleteObject(Hr);
...

И по идее ВСЕ ! :idea: :idea:
"Ку народам !" :mrgreen:
Все бы вообще было прекрасно если бы ...
1) При отличной работе эллипсом, разными прямоугольниками, картинками и текстом метод "не видит" линий, поли-линий (и все что из них состоит ) и почему-то (что совсем уж непонятно :roll: ) градиенты ...
2) Как-то не очень понятно как оказывает влияние на общее состояние окна (Хотя возможно это сугубо мои хомуты но изображение продергивается
как только в программе появляется секция кода BeginРath(CurCanvas .Handle); ... Endpath(CurCanvas .Handle); несмотря на то что CurCanvas смотрит на невидимый элемент )
3) Не работает при прорисовке мета-фйала ...
Зы
Самым красивым способом применения этого фрагмента был бы вызов при записи и обновлении списка метафайлов ...
Но" увы и ах" секция BeginРath(CurCanvas .Handle); ... Endpath(CurCanvas .Handle); записывается метофайл как-то криво .
Да можно еще раз вызвать DrawFig(-1,DrawList[i]); перед BeginРath ... но это сами понимаете изрядный тормозон ... :cry:
(И что в метофайл запишется не совсем понятно ... )

Добавлено спустя 1 час 24 минуты 4 секунды:
Re: Как оптимизировать определение границ произвольной фигуры ?
По трейду ... Дело в том что "чистую математику" тоже можно лихо оптимизировать ... чисто "кодерными" путями ...
(Использовать чисто целочисленные вычисления, расширения CPU, сдвиг вместо умножения и деления отслеживать разные частные случаи ( вместо одного решения "в общем виде" ) и тд и т.п. Даже мне все это известно хотя-бы в теории . Но вот беда это требует огромного количества времени на упражнение в коднинге .
Есть места где это более чем оправдано (Когда появился DOOM многие реально умелые прикладные математики прикинув "на коленке" затраты памяти и время на расчет кадра "в лоб" на чистой математике реально "не верили своим глазам" бо цифры получались совершенно ирреальные и неподъемные для железа того времени )
Но в задачах попроще такой нужды обычно нет ... Именно поэтому я радуюсь каждой обнаруженной мной возможности применить быстрые бинарные или вообще системные функции . есть шанс что там будет заложена именно умная "кодерная" оптимизация которую иначе мне придется прилить и пилить в меру своего не слишком богатого опыта ...
И как ведите я не обманулся в ожиданиях pathToRegion работает настолько быстро, что счетчик времени за ним не успевает показывая "пять нулей" (А при увеличении разрешения просто "статистический белый шум" от работы многозадачной системы ...)

Добавлено спустя 15 часов 9 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
Пока сделал так
{-------------------------------------------------------------------------
Это кусок кода из процедуры быстрой прорисовки произвольного фрагмента DrawList)
FastDrawFig(PosInList,FigCount:LongInt);
Вызывается только при изменении и дополнении списка команд
====================================== )
Код: Выделить всё
// Инициализирую метафайл ...
     MyMetafile := TMetafile.Create;
     MC:= TMetafileCanvas.CreateWithComment(MyMetafile, BufBMP.Canvas.handle,
      'Author', 'Made This');
      MC.Pen.Mode:= CurCanvas.Pen.Mode;
      CurCanvas:=MC;//Перенаправляю Canvas
       
        DrawFig(-1,DrawList[i]);//Рисую фигуру (Вот от этого вызова желательно избавится ! )
        S:=DrawList[i];
        // Это временный чит ... (Сам бы себя забанил  ! )
       // Часть тупя подмена команды на "удобную"
       // Часть  переход на медленный самопал RecogRect(I)..
        FSR:=False;
        case next1(S,' ') of
         'STAR','RAPHAEL_STAR':S:='RECT '+S;
         'LINE','RAPHAEL_LINE':S:='RECT '+S;
         'RAPHAEL_GRADI':// Тут случай чуть сложнее
         begin
           S1:='RECT '+next1(S,' ')+' '+next1(S,'/')+' ';
           next1(S,' ');S:=S1+S;
         end;
         'RAPHAEL_KUB','KUB':FSR:=true;
         'RAPHAEL_POLILINE','POLILINE':FSR:=true;
         'RAPHAEL_KONTUR','KONTUR':FSR:=true;
         else S:=DrawList[i]
        end ;

     If not FSR Then begin
            Beginpath(mc.Handle);
               DrawFig(-1,S);//Рисую фигуру (Опять перерисовка для получения пути  )
            endpath(mc.Handle);
         //FlattenPath(mc.Handle);
             HR:=pathToRegion(mc.Handle);
             GetRgnBox(Hr,R);
             DeleteObject(Hr);
       end;
      MC.Free; //! Обязательно очищать MetafileCanvas  перед "клонированием" ...
      CurCanvas:=SaveCanvas;// Востанавливаю Canvas...


...а ниже еще вот эта строчка ...
If FSR Then PR^:=RecogRect(I) else PR^:=R;;

где RecogRect(I) - "обычное" (почти тоже самое что и в шапке темы) определение границ ...

:idea: "Чит" это разумеется жестокая "бяка" из за него теряется "универсальность" части скриптов ....
+ RecogRect(I) увы зависим от текущего размера окна ... (То есть нужен пересчет ректов для "исключений" при изменении размеров рабочего поля )

Но все-же это пока лучший по скорости код ...
Зы
В принципе "универсальность скриптов" перерисовки фигур можно сохранить через добавление специального "флага исключения" (возвращаемого скриптом ) или возможности по разному рисовать фигуры для получения границ и для обычного случая ...
Тем более что "глюк линии" как мне кажется можно как-то исправить ... (Имхо там опять "канвас - работает за нас" )
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 12.02.2017 18:27:25

У тебя вся программа состоит из какихто багов хаков и костылей. так нельзя.
POLyLINE
Сравнивать стринги, и вообще сам подход на стрингах (передача в скрипты значений тоже стрингами?) мягко скажем - не очень нормально
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 12.02.2017 23:57:11

zub писал(а):У тебя вся программа состоит из какихто багов хаков и костылей. так нельзя.
POLyLINE
Сравнивать стринги, и вообще сам подход на стрингах (передача в скрипты значений тоже стрингами?) мягко скажем - не очень нормально


Насчет 'POLyLINE' могу вообще написать "ПОЛИЛИНИЯ " (Кстати, хорошая мысль !)... На то и скрипты (мой "потынок" как хочу так и называю :lol: )...
...Но это разумеется просто опечатка с скрипте генерации команды которую я скопировал ... :oops:

Насчет хаков я с тобой совершено согласен "так нельзя"...
В Коментарии так и написано Это временный чит ... (то есть даже не хак а временная заглушка системного бага )


А что касаться текстового потока команд ... то как раз от тебя я честно говоря такого пасажа не ожидал ...
У меня благодаря этому есть что-то вроде командного интерфейса (как в автокаде ) , возможность в ручную править файлы и максимальная гибкость добавлении новых элиментов ... ( В хайасме при всем его хорошем внутренний язык SHA схем практически не читабелен в принципе ... когда я начал делать редактор я сразу решил избавится от подобного "недоразумения " в своем проекте ... не казать что все команды читабельны по молчанию но у меня кроме инспектора и командного интерфейса есть гибридный редактор специально для разных "сложных случаев " )

ИзображениеИзображение
Последний раз редактировалось Alex2013 13.02.2017 00:04:43, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 13.02.2017 00:03:56

В смысле не ожидал? Паскаль как и паскальскрипт строго типизированы, вполне логично это использовать.
Ну а стринги сравнивать просто нахуа? идентификаторы должны быть числовые а не строковые.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 13.02.2017 00:07:00

zub писал(а):В смысле не ожидал? Паскаль как и паскальскрипт строго типизированы, вполне логично это использовать.
Ну а стринги сравнивать просто нахуа? идентификаторы должны быть числовые а не строковые.

Еще раз повторяю ... Это не просто строки данных, а КОМАНДЫ разницу улавливаешь ?
Так зачем мне их эний раз парсить перед передачей данных в скрипт (неясно по каким законам ) если все можно все сделать парой строк внутри скрипта ?
Индивидуально для конкретного элемента .(Там почти полная свобода в составлении команды и программа ничего кроме команды не знает )

Есть отдельный механизм заполнения таблицы и возврата данных из таблицы в команду ...
Есть начальная генерация самой команды ...
Есть генерация HTML кода ...
Но это все параллельно механизму прорисовки . Почти полная инкапсуляция по функциям :idea:
Да скрипты и метод взаимодействия пока очень далеки от оптимальных .
Но весь набор элементов уже сейчас работает (преград дополнению их списка нет в принципе )а в "моноблочной" схеме я бы точно уже дано бы заблудился ... :roll:
Последний раз редактировалось Alex2013 13.02.2017 00:47:06, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 13.02.2017 00:25:12

я невидел твоих исходников, но судя по
Код: Выделить всё
case next1(S,' ') of
         'STAR',
...

это обычная строка. можешь называть как хочешь, сути это неменяет.
имя команды + параметры, потом скрипт парсит параметры... угадал?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 13.02.2017 00:37:06

zub писал(а):я невидел твоих исходников, но судя по
Код: Выделить всё
case next1(S,' ') of
         'STAR',
...

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

Разумеется, а next1(S,' ') и есть с позволения сказать "парсер" .. :wink:
(Вырезает из строки (передаваемой через VAR ) все до определенного символа ( помещая обрезок в результат) и выбрасывая сам символ .. имхо проще не придумаешь )...
Последний раз редактировалось Alex2013 13.02.2017 00:53:02, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 13.02.2017 00:52:17

>>имхо проще не придумаешь )...
Ты уже очень много придумал)) Потом удивляеешся почему у тебя скрипты медленно работают...
У тебя в основе всего самые тормозные варианты... а потом многостраничные топики про какието мифические оптимизации, где с умным видом упоминаются какието ассемблеры, куды, сканлайны))
Работа с стрингами медленна. работа с стрингами в скрипте еще медленный, если ты каждый раз чтото парсишь - забудь про скорость. А еще если парсер писал не вникая, чтоб побыстрее...
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 13.02.2017 01:04:13

"Мифические методы" не работают совсем ... а мои все же действуют ! Скрипты я и не собирался "оптимизировать" ... Сразу было понятно, что от них можно ждать, а чего нельзя ждать ждать в принципе ! Основная их задача генерация произвольного HTML кода все прочее "сопутствующий ущерб" ... :mrgreen:
Который можно и нужно минимизировать ...
Зы
:idea: Понятно ведь вроде написано :
{-------------------------------------------------------------------------
Это кусок кода из процедуры быстрой прорисовки произвольного фрагмента DrawList)
FastDrawFig(PosInList,FigCount:LongInt);
Вызывается только при изменении и дополнении списка команд } :roll:
То есть обычно по одному разу при добавлении или изменении отдельной команды ...
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 13.02.2017 01:20:45

>>Понятно ведь вроде написано :
Тебе наверно понятно, мне - нет.
Также мне непонятно зачем вообще строки в качестве параметра - это медленно и ненадежно. FPC и PS вполне могут тебе обеспечить контроль параметров как в compiletime так и в runtime... ну да ладно - тебе видней.
А подходы типа
Код: Выделить всё
case next1(S,' ') of
         'STAR',
...

вообще противоречат скриптовой идеологии - скрипты ведь будем добавлять после компиляции и на момент компиляции их имена неизвестны. Хош нехош надо искать способ рантайм определения "совместимости" скрипта. "прокладка" его предоставляет - мы можем там не только определить габариты, но и посчитать какие вызовы осуществляет скрипт - есть ли среди них "несовместимые"
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как оптимизировать определение границ произвольной фигур

Сообщение Alex2013 » 13.02.2017 03:00:13

Фырштейн ? Них Фырштейн .. :mrgreen:
>>...вообще противоречат скриптовой идеологи...
:idea: Согласен на 222% процента ... Но отлаживать как-то то что работает нужно ? Нужно !
(А натыкаться на артефакты не хотелось вот и сделал "заплатку" по имени "заплатка" )
Но выше описан светлый путь по которому придется идти если ничего поправить не получится ...

Там еще одни глюк обнаружился строго вертикальные и строго горизонтальные линии не распознаются даже после "подмены " ...
но рект при этом возвращается не измененный а значит можно просто проверить и поставить FSR:=true; автоматом
что кстати позволяет и от вот этой

'RAPHAEL_KUB','KUB':FSR:=true;
'RAPHAEL_POLILINE','POLILINE':FSR:=true;
'RAPHAEL_KONTUR','KONTUR':FSR:=true;
части "не выдержанной идеологически" заплатки избавится ...
То есть остается пять не обрабатываемых автоматом элементов .
'STAR','RAPHAEL_STAR':S:='RECT '+S;
'LINE','RAPHAEL_LINE':S:='RECT '+S;
'RAPHAEL_GRADI':// Тут случай чуть сложнее
В прочем вроде бы линии тоже нули возвращали ... так что два всего ДВА исключения не обрабатываются автоматически .

и как уже писал

В крайнем случае
"универсальность скриптов" перерисовки фигур можно сохранить через добавление специального "флага исключения" (возвращаемого скриптом ) или возможности по разному рисовать фигуры для получения границ и для обычного случая ...

...а для простейших ситуаций вроде'RAPHAEL_GRADI' можно вообще сразу рект из скрипта возвращать ...
Зы
Чем толочь воду лучше-бы подсобил с "исследованием функций" PathToRegion а то вполне возможно что я просто "не умею её готовить" ... :idea: :idea: :idea: :roll: Классная ведь фича ! Неужели самому не интересно ?
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Как оптимизировать определение границ произвольной фигур

Сообщение zub » 13.02.2017 09:22:25

Не интересно.
Какие ошибки она возвращает?
Предположу что ей требуется замкнутый путь, твои открытые не фурычат.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 91

Рейтинг@Mail.ru