【问题标题】:Drawing tons of circles in Python using cairo使用 cairo 在 Python 中绘制大量圆圈
【发布时间】:2012-09-25 16:10:43
【问题描述】:

我目前正在开发一个应用程序,它使用视频投影仪来创建类似于真实激光的效果。可以在 Youtube here 上看到我正在尝试归档的一个非常好的示例。

基本上,该应用程序需要绘制各种颜色的简单移动形状。我有一个使用 pycairo 的非常复杂的设置,允许基元通过一组修改器来更改位置、缩放和旋转。这提供了很大的灵活性。

不幸的是,pycairo 在画虚线圆方面似乎很慢。我试着画了 30 个这样的圆圈:

# setup, transforms...
# Example color-scheme:
self._colors = [(0.0, 1.0, 0.0)]
# drawing dashes one after another
for count, color in enumerate(self._colors):
    cr.set_dash(dash_len, self._dash_len * count)
    cr.set_source_rgb(color[0], color[1], color[2])

    cr.arc(0, 0, self.radius(), 0, 2 * math.pi)
    cr.stroke()

整个事情看起来像this。使用 Core2Duo 在 800x600 上无法维持 25fps。

有没有更快的画圆的方法?质量不是真正的问题。

感谢您的帮助!

【问题讨论】:

  • 您是否考虑过绘制 n 边形而不是圆形?应该更快,并且在 N 足够高的情况下,您不会看到太大的差异。
  • 你也可以尝试关闭抗锯齿等
  • @Junuxx 我尝试了 20-gons,它们的速度大致相同。尽管@Qnan 我的设置代码中已经有cr.set_tolerance(0.5),但您的想法看起来很有希望,还有更多吗?
  • 您可以在临时表面上绘制一次圆圈(具有透明背景!),然后将该临时表面绘制到“屏幕表面”。这应该避免一直光栅化圆圈的成本。

标签: python performance cairo pycairo


【解决方案1】:

Cairo 的目标是高质量渲染 - 它在 2d 事物的静态或准静态渲染中被大量使用。

难怪它会很慢 -- 我想我会在你的位置上做的第一次尝试是使用 pygame + pyopenGL -- 很抱歉,我没有提供完整的示例,但这个项目看起来是一个好的开始: http://www.willmcgugan.com/blog/tech/2007/6/4/opengl-sample-code-for-pygame/

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 2018-08-29
    • 1970-01-01
    • 2015-07-04
    • 2018-10-18
    • 2021-10-15
    • 2013-12-02
    • 2014-04-11
    • 2012-09-19
    相关资源
    最近更新 更多