Как быстро нарисовать много полигонов в Pycairo? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть функция, которая рисует полигоны в контексте Pycairo следующим образом:

def draw_polygon(context, polygon):
    context.move_to(*polygon[0])
    for point in polygon:
        context.line_to(*point)
    context.line_to(*polygon[0])

Затем этот цикл вызывается много раз (~ 350k) этим циклом:

for polygon in polygons:
    draw_polygon(context, polygon)
    context.stroke()

Выполнение cProfiler на вещах, draw_polygon является основным узким местом, занимая около 60% tottime.

Какой хороший подход к оптимизации этого типа чертежа, когда задействованы большие объемы геометрии?Есть ли способ, подобный openGL, собрать геометрию в список вершин или другую оптимизированную структуру данных?

1 Ответ

0 голосов
/ 14 февраля 2019

Есть ли способ, подобный openGL, собрать геометрию в список вершин или другую оптимизированную структуру данных?

Существует context.append_path().Внутренне, это просто вызывает другие функции C и не делает ничего особенного, но, возможно, это может сэкономить некоторые издержки от pycairo?Я не уверен, что это действительно будет быстрее.

Тем не менее, документы для append_path говорят следующее, что заставляет меня думать, что вы не можете реально построить эту структуру данных из чистого Python:

Добавить путь к текущему пути.Путь может быть либо значением, возвращаемым одним из Context.copy_path () или Context.copy_path_flat (), либо его можно создать вручную (в C).

...