Как оптимизировать определение границ произвольной фигуры ?
Модератор: Модераторы
FreeAndNil - эт что? Таблетка от всех болезней?
Посмотрите что делают bmp.Clear и bmp.FreeImage...
п.с.
каждому куличику...
Посмотрите что делают bmp.Clear и bmp.FreeImage...
п.с.
каждому куличику...
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
pupsik писал(а): А толку, возможно, никакого. Менять алексу надо логику программы. Иначе или лаги, или странные вопросы.
Ну, собственно, толк есть. ТС все же решил поменять, хоть частично, логику работы.
vitaly_l писал(а):Если ответ, Да, то в общем-то я прислушаюсь и буду удалять командой FreeAndNil.
Вообще-то, это мало чем отличается от Free.
FreeAndNil - желательно применять там где активно создаются и удаляются объекты, работа с указателями, или есть необходимость пересоздавать объекты..
c Free переменная не обнуляется, и указывает на мусор или зомби. И если повторно использовать переменную - легко въехать в кучу мусора получить экспешен, а можно поработать с зомби объектом - но не факт что он будет полноценно живой.
c Free переменная не обнуляется, и указывает на мусор или зомби. И если повторно использовать переменную - легко въехать в кучу мусора получить экспешен, а можно поработать с зомби объектом - но не факт что он будет полноценно живой.
Ну разошлись тут без меня ..
Не применено почитаю, что ту за споры шли ... но чуть позже .
А пока спешу сообщить, что мной найдена потенциально "закрывающая " вопрос технология ...
(Отдельное спасибо тов Pavia за направление поиска )
И по идее ВСЕ !
"Ку народам !"
Все бы вообще было прекрасно если бы ...
1) При отличной работе эллипсом, разными прямоугольниками, картинками и текстом метод "не видит" линий, поли-линий (и все что из них состоит ) и почему-то (что совсем уж непонятно
) градиенты ...
2) Как-то не очень понятно как оказывает влияние на общее состояние окна (Хотя возможно это сугубо мои хомуты но изображение продергивается
как только в программе появляется секция кода BeginРath(CurCanvas .Handle); ... Endpath(CurCanvas .Handle); несмотря на то что CurCanvas смотрит на невидимый элемент )
3) Не работает при прорисовке мета-фйала ...
Зы
Самым красивым способом применения этого фрагмента был бы вызов при записи и обновлении списка метафайлов ...
Но" увы и ах" секция BeginРath(CurCanvas .Handle); ... Endpath(CurCanvas .Handle); записывается метофайл как-то криво .
Да можно еще раз вызвать DrawFig(-1,DrawList[i]); перед BeginРath ... но это сами понимаете изрядный тормозон ...
(И что в метофайл запишется не совсем понятно ... )
Добавлено спустя 1 час 24 минуты 4 секунды:
Re: Как оптимизировать определение границ произвольной фигуры ?
По трейду ... Дело в том что "чистую математику" тоже можно лихо оптимизировать ... чисто "кодерными" путями ...
(Использовать чисто целочисленные вычисления, расширения CPU, сдвиг вместо умножения и деления отслеживать разные частные случаи ( вместо одного решения "в общем виде" ) и тд и т.п. Даже мне все это известно хотя-бы в теории . Но вот беда это требует огромного количества времени на упражнение в коднинге .
Есть места где это более чем оправдано (Когда появился DOOM многие реально умелые прикладные математики прикинув "на коленке" затраты памяти и время на расчет кадра "в лоб" на чистой математике реально "не верили своим глазам" бо цифры получались совершенно ирреальные и неподъемные для железа того времени )
Но в задачах попроще такой нужды обычно нет ... Именно поэтому я радуюсь каждой обнаруженной мной возможности применить быстрые бинарные или вообще системные функции . есть шанс что там будет заложена именно умная "кодерная" оптимизация которую иначе мне придется прилить и пилить в меру своего не слишком богатого опыта ...
И как ведите я не обманулся в ожиданиях pathToRegion работает настолько быстро, что счетчик времени за ним не успевает показывая "пять нулей" (А при увеличении разрешения просто "статистический белый шум" от работы многозадачной системы ...)
Добавлено спустя 15 часов 9 секунд:
Re: Как оптимизировать определение границ произвольной фигуры ?
Пока сделал так
{-------------------------------------------------------------------------
Это кусок кода из процедуры быстрой прорисовки произвольного фрагмента DrawList)
FastDrawFig(PosInList,FigCount:LongInt);
Вызывается только при изменении и дополнении списка команд
====================================== )
...а ниже еще вот эта строчка ...
If FSR Then PR^:=RecogRect(I) else PR^:=R;;
где RecogRect(I) - "обычное" (почти тоже самое что и в шапке темы) определение границ ...
"Чит" это разумеется жестокая "бяка" из за него теряется "универсальность" части скриптов ....
+ RecogRect(I) увы зависим от текущего размера окна ... (То есть нужен пересчет ректов для "исключений" при изменении размеров рабочего поля )
Но все-же это пока лучший по скорости код ...
Зы
В принципе "универсальность скриптов" перерисовки фигур можно сохранить через добавление специального "флага исключения" (возвращаемого скриптом ) или возможности по разному рисовать фигуры для получения границ и для обычного случая ...
Тем более что "глюк линии" как мне кажется можно как-то исправить ... (Имхо там опять "канвас - работает за нас" )
Не применено почитаю, что ту за споры шли ... но чуть позже .
А пока спешу сообщить, что мной найдена потенциально "закрывающая " вопрос технология ...
(Отдельное спасибо тов 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);
...
И по идее ВСЕ !
"Ку народам !"
Все бы вообще было прекрасно если бы ...
1) При отличной работе эллипсом, разными прямоугольниками, картинками и текстом метод "не видит" линий, поли-линий (и все что из них состоит ) и почему-то (что совсем уж непонятно
2) Как-то не очень понятно как оказывает влияние на общее состояние окна (Хотя возможно это сугубо мои хомуты но изображение продергивается
как только в программе появляется секция кода BeginРath(CurCanvas .Handle); ... Endpath(CurCanvas .Handle); несмотря на то что CurCanvas смотрит на невидимый элемент )
3) Не работает при прорисовке мета-фйала ...
Зы
Самым красивым способом применения этого фрагмента был бы вызов при записи и обновлении списка метафайлов ...
Но" увы и ах" секция BeginРath(CurCanvas .Handle); ... Endpath(CurCanvas .Handle); записывается метофайл как-то криво .
Да можно еще раз вызвать DrawFig(-1,DrawList[i]); перед BeginРath ... но это сами понимаете изрядный тормозон ...
(И что в метофайл запишется не совсем понятно ... )
Добавлено спустя 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) - "обычное" (почти тоже самое что и в шапке темы) определение границ ...
+ RecogRect(I) увы зависим от текущего размера окна ... (То есть нужен пересчет ректов для "исключений" при изменении размеров рабочего поля )
Но все-же это пока лучший по скорости код ...
Зы
В принципе "универсальность скриптов" перерисовки фигур можно сохранить через добавление специального "флага исключения" (возвращаемого скриптом ) или возможности по разному рисовать фигуры для получения границ и для обычного случая ...
Тем более что "глюк линии" как мне кажется можно как-то исправить ... (Имхо там опять "канвас - работает за нас" )
У тебя вся программа состоит из какихто багов хаков и костылей. так нельзя.
POLyLINE
Сравнивать стринги, и вообще сам подход на стрингах (передача в скрипты значений тоже стрингами?) мягко скажем - не очень нормально
POLyLINE
Сравнивать стринги, и вообще сам подход на стрингах (передача в скрипты значений тоже стрингами?) мягко скажем - не очень нормально
zub писал(а):У тебя вся программа состоит из какихто багов хаков и костылей. так нельзя.
POLyLINE
Сравнивать стринги, и вообще сам подход на стрингах (передача в скрипты значений тоже стрингами?) мягко скажем - не очень нормально
Насчет 'POLyLINE' могу вообще написать "ПОЛИЛИНИЯ " (Кстати, хорошая мысль !)... На то и скрипты (мой "потынок" как хочу так и называю
...Но это разумеется просто опечатка с скрипте генерации команды которую я скопировал ...
Насчет хаков я с тобой совершено согласен "так нельзя"...
В Коментарии так и написано Это временный чит ... (то есть даже не хак а временная заглушка системного бага )
А что касаться текстового потока команд ... то как раз от тебя я честно говоря такого пасажа не ожидал ...
У меня благодаря этому есть что-то вроде командного интерфейса (как в автокаде ) , возможность в ручную править файлы и максимальная гибкость добавлении новых элиментов ... ( В хайасме при всем его хорошем внутренний язык SHA схем практически не читабелен в принципе ... когда я начал делать редактор я сразу решил избавится от подобного "недоразумения " в своем проекте ... не казать что все команды читабельны по молчанию но у меня кроме инспектора и командного интерфейса есть гибридный редактор специально для разных "сложных случаев " )


Последний раз редактировалось Alex2013 12.02.2017 23:04:43, всего редактировалось 1 раз.
В смысле не ожидал? Паскаль как и паскальскрипт строго типизированы, вполне логично это использовать.
Ну а стринги сравнивать просто нахуа? идентификаторы должны быть числовые а не строковые.
Ну а стринги сравнивать просто нахуа? идентификаторы должны быть числовые а не строковые.
zub писал(а):В смысле не ожидал? Паскаль как и паскальскрипт строго типизированы, вполне логично это использовать.
Ну а стринги сравнивать просто нахуа? идентификаторы должны быть числовые а не строковые.
Еще раз повторяю ... Это не просто строки данных, а КОМАНДЫ разницу улавливаешь ?
Так зачем мне их эний раз парсить перед передачей данных в скрипт (неясно по каким законам ) если все можно все сделать парой строк внутри скрипта ?
Индивидуально для конкретного элемента .(Там почти полная свобода в составлении команды и программа ничего кроме команды не знает )
Есть отдельный механизм заполнения таблицы и возврата данных из таблицы в команду ...
Есть начальная генерация самой команды ...
Есть генерация HTML кода ...
Но это все параллельно механизму прорисовки . Почти полная инкапсуляция по функциям
Да скрипты и метод взаимодействия пока очень далеки от оптимальных .
Но весь набор элементов уже сейчас работает (преград дополнению их списка нет в принципе )а в "моноблочной" схеме я бы точно уже дано бы заблудился ...
Последний раз редактировалось Alex2013 12.02.2017 23:47:06, всего редактировалось 2 раза.
я невидел твоих исходников, но судя по
это обычная строка. можешь называть как хочешь, сути это неменяет.
имя команды + параметры, потом скрипт парсит параметры... угадал?
Код: Выделить всё
case next1(S,' ') of
'STAR',
...это обычная строка. можешь называть как хочешь, сути это неменяет.
имя команды + параметры, потом скрипт парсит параметры... угадал?
zub писал(а):я невидел твоих исходников, но судя поКод: Выделить всё
case next1(S,' ') of
'STAR',
...
это обычная строка. можешь называть как хочешь, сути это неменяет.
имя команды + параметры, потом скрипт парсит параметры... угадал?
Разумеется, а next1(S,' ') и есть с позволения сказать "парсер" ..
(Вырезает из строки (передаваемой через VAR ) все до определенного символа ( помещая обрезок в результат) и выбрасывая сам символ .. имхо проще не придумаешь )...
Последний раз редактировалось Alex2013 12.02.2017 23:53:02, всего редактировалось 1 раз.
>>имхо проще не придумаешь )...
Ты уже очень много придумал)) Потом удивляеешся почему у тебя скрипты медленно работают...
У тебя в основе всего самые тормозные варианты... а потом многостраничные топики про какието мифические оптимизации, где с умным видом упоминаются какието ассемблеры, куды, сканлайны))
Работа с стрингами медленна. работа с стрингами в скрипте еще медленный, если ты каждый раз чтото парсишь - забудь про скорость. А еще если парсер писал не вникая, чтоб побыстрее...
Ты уже очень много придумал)) Потом удивляеешся почему у тебя скрипты медленно работают...
У тебя в основе всего самые тормозные варианты... а потом многостраничные топики про какието мифические оптимизации, где с умным видом упоминаются какието ассемблеры, куды, сканлайны))
Работа с стрингами медленна. работа с стрингами в скрипте еще медленный, если ты каждый раз чтото парсишь - забудь про скорость. А еще если парсер писал не вникая, чтоб побыстрее...
"Мифические методы" не работают совсем ... а мои все же действуют ! Скрипты я и не собирался "оптимизировать" ... Сразу было понятно, что от них можно ждать, а чего нельзя ждать ждать в принципе ! Основная их задача генерация произвольного HTML кода все прочее "сопутствующий ущерб" ...
Который можно и нужно минимизировать ...
Зы
Понятно ведь вроде написано :
{-------------------------------------------------------------------------
Это кусок кода из процедуры быстрой прорисовки произвольного фрагмента DrawList)
FastDrawFig(PosInList,FigCount:LongInt);
Вызывается только при изменении и дополнении списка команд }
То есть обычно по одному разу при добавлении или изменении отдельной команды ...
Который можно и нужно минимизировать ...
Зы
{-------------------------------------------------------------------------
Это кусок кода из процедуры быстрой прорисовки произвольного фрагмента DrawList)
FastDrawFig(PosInList,FigCount:LongInt);
Вызывается только при изменении и дополнении списка команд }
То есть обычно по одному разу при добавлении или изменении отдельной команды ...
>>Понятно ведь вроде написано :
Тебе наверно понятно, мне - нет.
Также мне непонятно зачем вообще строки в качестве параметра - это медленно и ненадежно. FPC и PS вполне могут тебе обеспечить контроль параметров как в compiletime так и в runtime... ну да ладно - тебе видней.
А подходы типа
вообще противоречат скриптовой идеологии - скрипты ведь будем добавлять после компиляции и на момент компиляции их имена неизвестны. Хош нехош надо искать способ рантайм определения "совместимости" скрипта. "прокладка" его предоставляет - мы можем там не только определить габариты, но и посчитать какие вызовы осуществляет скрипт - есть ли среди них "несовместимые"
Тебе наверно понятно, мне - нет.
Также мне непонятно зачем вообще строки в качестве параметра - это медленно и ненадежно. FPC и PS вполне могут тебе обеспечить контроль параметров как в compiletime так и в runtime... ну да ладно - тебе видней.
А подходы типа
Код: Выделить всё
case next1(S,' ') of
'STAR',
...вообще противоречат скриптовой идеологии - скрипты ведь будем добавлять после компиляции и на момент компиляции их имена неизвестны. Хош нехош надо искать способ рантайм определения "совместимости" скрипта. "прокладка" его предоставляет - мы можем там не только определить габариты, но и посчитать какие вызовы осуществляет скрипт - есть ли среди них "несовместимые"
Фырштейн ? Них Фырштейн ..
>>...вообще противоречат скриптовой идеологи...
Согласен на 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 а то вполне возможно что я просто "не умею её готовить" ...
Классная ведь фича ! Неужели самому не интересно ?
>>...вообще противоречат скриптовой идеологи...
(А натыкаться на артефакты не хотелось вот и сделал "заплатку" по имени "заплатка" )
Но выше описан светлый путь по которому придется идти если ничего поправить не получится ...
Там еще одни глюк обнаружился строго вертикальные и строго горизонтальные линии не распознаются даже после "подмены " ...
но рект при этом возвращается не измененный а значит можно просто проверить и поставить 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 а то вполне возможно что я просто "не умею её готовить" ...
Не интересно.
Какие ошибки она возвращает?
Предположу что ей требуется замкнутый путь, твои открытые не фурычат.
Какие ошибки она возвращает?
Предположу что ей требуется замкнутый путь, твои открытые не фурычат.
