【问题标题】:Drawing fast lines in pygame在pygame中绘制快速线条
【发布时间】:2010-12-20 16:55:57
【问题描述】:

我正在尝试使用不直接呈现到屏幕的 pygame 绘制快速线条。我有一个与所需分辨率的像素数一样大的 Python 列表,并存储与线算法命中该像素的次数相对应的整数值。使用它,可以构建一个 2D 热图,因此不是绘制一个平面像素值,而是根据一条线穿过它的次数增加像素值,并且“热”像素获得更亮的颜色。

这样做的原因是我们事先不知道要绘制多少条线,以及任何给定像素将被击中的最大次数。由于我们希望缩放输出以使每次渲染都具有正确的最大和最小 RGB 值,因此我们不能只在屏幕上绘制。

有没有比相对幼稚的 Bresenham 算法更好的方法来绘制这些线?这是drawLine函数的关键部分:

  # before the loop, to save repeated multiplications
  xm = []
  for i in range(resolution[0]):
    xm.append(i * resolution[0])

  # inside of drawLine, index into the f list, of size resolution[0] * resolution[1]
  for x in range(x0, x1 + 1):
    if steep:
      idx = y + xm[x]
      f[idx] += 1
    else:
      idx = x + xm[y]
      f[idx] += 1

最终结果根据 f 内部的最大值进行缩放并绘制到屏幕上。例如,如果最大值为 1000,则可以假设每个像素的 RGB 值为 (f[i] * 255) / 1000。

配置文件信息表明运行时主要由对 f 的索引查找控制。我这里用了之前的问题来证明这些基本列表比numpy数组或者Python中的数组要快,但是像这样画线,看来还是有改进的空间。

什么是在屏幕上绘制未知数量的线的好且快速的方法,知道您最终将缩放输出以呈现到屏幕上?有没有摆脱索引开销的好方法?

【问题讨论】:

    标签: python pygame bresenham


    【解决方案1】:

    试试 Cython 或类似的东西。 (如果你这样做了,我很想知道这是否/有多大帮助)

    Cython 是一种编程语言 简化编写 C 和 C++ 扩展 CPython Python 的模块 运行。严格来说,赛通 语法是 Python 语法的超集 附加支持:直接 调用 C 函数或 C++ 函数/方法,来自 Cython 代码。 Cython 变量的强类型化, 类和类属性为 C 类型。 Cython 编译为 C 或 C++ 代码而不是 Python,并且 结果用作 Python 扩展 模块或作为独立应用程序 嵌入 CPython 运行时。 (http://en.wikipedia.org/wiki/Cython)

    【讨论】:

    • 当然你需要cdef正确,否则它会带来最多 10%。
    • 完美,带有 numpy 和适当的 cdef 语句的 Cython 已经显着改进了事情,即使是最基本的添加。我会继续努力,但到目前为止,在 numpy 数组上转换为显式 int 索引的速度大约提高了 80%-90%。谢谢!
    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多