Судя по описанию возможностей AGG, в нём реализована возможность отсечения полигонов, не попадающих в clipping box. Самостоятельно не смог ни разобраться, ни нагуглить.
К примеру, в нижеприведённом коде строчка
замедляет выполнение более чем в 10 раз. Видимо, из-за того, что рендерер обрабатывает каждый пиксель этой мегалинии, вместо того, чтобы сразу отсечь её, как заведомо не попадающую в растр. Как это сделать средствами AGG?
__>Судя по описанию возможностей AGG, в нём реализована возможность отсечения полигонов, не попадающих в clipping box. Самостоятельно не смог ни разобраться, ни нагуглить. __>К примеру, в нижеприведённом коде строчка
__>
__>замедляет выполнение более чем в 10 раз. Видимо, из-за того, что рендерер обрабатывает каждый пиксель этой мегалинии, вместо того, чтобы сразу отсечь её, как заведомо не попадающую в растр. Как это сделать средствами AGG?
А если увеличить длину этой линии в два раза, то как изменится время?
Оно, вроде, и логично — на сайте http://www.antigrain.com/doc/basic_renderers/basic_renderers.agdoc.html#toc0009 и написано, что renderer_base и renderer_mclip обеспечивают отсечение лишь на пиксельном уровне. А как использовать заявленное векторное отсечение я там не нашёл и по копанию в исходниках не понял. renderer_outline_aa тоже, вроде, не отсекает.
Там в сырцах пример такой есть multi_clip.cpp, детально не смотрел, по ненадобности.
Посмотрите может поможет вам?
Расскажите потом тут как решили проблему.
Подумалось: попробуй убрать conv_stroke и рисовать просто полигоны.
Соответственно вместо длинной линии нарисуй длинный прямоугольник.
Как будет зависеть время от длинны длинного прямоугольника?
Здравствуйте, nen777w, Вы писали:
N>Там в сырцах пример такой есть multi_clip.cpp, детально не смотрел, по ненадобности. N>Посмотрите может поможет вам? N>Расскажите потом тут как решили проблему.
multi_clip смотрел. Насколько я понимаю, там просто создаются несколько прямоугольников отсечения, но проверяется каждый пиксель. О чем косвенно свидетельствует то, что в дебажной версии отрисовка тормозит, если очень увеличить масштаб.
Здравствуйте, WinterMute, Вы писали:
WM>Подумалось: попробуй убрать conv_stroke и рисовать просто полигоны. WM>Соответственно вместо длинной линии нарисуй длинный прямоугольник. WM>Как будет зависеть время от длинны длинного прямоугольника?
Для длинного узкого вертикального прямоугольника зависимость времени от длины та же — пропорциональна длине.
Насколько я помню там два примера — с отсечением на уровни пикселей и с отсечением на уровне полигонов. Еще там есть сторонний исходник на Си, в котором собственно и реализуется быстрый алгоритм отсечения.
Здравствуйте, Ka3a4oK, Вы писали:
KK>Насколько я помню там два примера — с отсечением на уровни пикселей и с отсечением на уровне полигонов. Еще там есть сторонний исходник на Си, в котором собственно и реализуется быстрый алгоритм отсечения.
Здравствуйте, WinterMute, Вы писали:
WM>ras.clip_box() пробовал?
WM>Хорошо бы услышать комментарии Максима, я был почти уверен что скорость отрисовки зависит скорее от числа линий, нежели от их длинны.
Ты знаешь, помогло Был уверен, что делал clip_box, но видимо, лишь для рендера, а не для rasterizer-а. Добавление строки
ras.clip_box( 0, 0, width-1, height-1 );
перед
ras.add_path( stroke );
решает проблему.
Дело оказалось вот в чём.
При описании класса растерайзера указывается тип клиппера. По умолчанию, это rasterizer_sl_clip_int:
rasterizer_scanline_aa<> эквивалентно rasterizer_scanline_aa<rasterizer_sl_clip_int>
У этого клиппера есть булева переменная m_clipping, значение которой, в конструкторе, устанавливается в false. reset_clipping также устанавливает false. И отсечение не производится. И вызов clip_box — единственный способ сделать её true. В move_to/line_to, в зависимости от значения этой переменной, точка либо просто добавляется, либо добавляется со всеми необходимыми пересчётами-отсечениями.
А я был уверен, что, если векторное отсечение не надо прикручивать отдельно, то оно должно быть включено по дефолту.
Здравствуйте, _vanger_, Вы писали:
__>Здравствуйте, Ka3a4oK, Вы писали:
KK>>Насколько я помню там два примера — с отсечением на уровни пикселей и с отсечением на уровне полигонов. Еще там есть сторонний исходник на Си, в котором собственно и реализуется быстрый алгоритм отсечения.
__>Не скажешь названия файлов?
Пример называется gpc_test. Generic Polygon Clipper находится в папке gpc.
Здравствуйте, _vanger_, Вы писали:
__>А я был уверен, что, если векторное отсечение не надо прикручивать отдельно, то оно должно быть включено по дефолту.