我正在编写一个python程序来做图形动画,我正在使用python cairo / rsvg库。我已达到速度问题,并希望通过在cython库中移动一些渲染代码来加速代码的某些部分。
理想情况下,我想扩充cairo库方法,添加一些针对我的需求进行优化的方法。
例如我有一个函数在屏幕上绘制一个svg,其中心点是一个带有强制其大小的边界框的点,通常这个函数由一个外部循环调用,该循环绘制了数十个svgs,而这个函数是其中一个我的代码中最贵的:
def svg(ctx, path, pos, angle, width, height):
"""Draws an svg file at coordinates pos with at a specific angle, and a
maximum bounding box of size width x height"""
if width == 0 or height == 0:
return
svg = rsvg.Handle(file=path) #any svg file
ctx.save()
#put in position
ctx.translate(pos.x, pos.y)
#rotate
ctx.rotate(angle)
#resize
if svg.props.width != width or svg.props.height != height:
ratiow = (width *1.0) / (svg.props.width*1.0)
ratioh = (height * 1.0) / (svg.props.height * 1.0)
ctx.scale(ratiow, ratioh)
#move center to 0,0 of image
ctx.translate(-svg.props.width / 2, - svg.props.height / 2)
#draw image
svg.render_cairo(ctx)
ctx.restore()
我想要做的是编写一个cython函数,给出svgs列表会在屏幕上一次性绘制它们。
这种优化可以用cython完成吗? 根据我的理解,为cairo上下文对象(ctx)定义一个类型是非常有益的,但是如何正确地进行呢?