Pygame PixelArray将像素修改分开太慢

时间:2017-08-07 12:21:48

标签: python python-3.x pygame pixel

我正在尝试使用Pygame和Cython制作3D游戏,但是分别修改PixelArray的每个像素非常慢(400 * 400 PixelArray需要60 ms)。 我正在使用此行来修改像素的颜色:

pixelArray[x,y] = 0xFF00FF

我尝试使用整数而不是十六进制值,但没有明显的区别。 我更改像素的功能使用上面显示的行:

cdef void paint_pixel(zArray,pixelArray,int x,int y,int z,color):
    if x < len(zArray) and y < len(zArray[0]):
        if (not x < 0) and (not y < 0):
            if zArray[x][y] > z or zArray[x][y] == -1:
                zArray[x][y] = z
                pixelArray[x,y] = 0xFF00FF

对于PixelArray上的每个像素,至少会调用一次。

有没有办法更快地分别更改每个像素?

其他信息: 我使用Python 3.4.4与Cython和Pygame。我想避免使用Numpy。

1 个答案:

答案 0 :(得分:0)

pygame.PixelArray模块是pygame如何为您提供一种改变曲面像素(或pygame.surfarray模块但依赖于numpy)的方法,并且偏离该模块很可能会导致在昂贵的转换中,可能比你获得的成本更高。

以下是您的替代方案。

  1. 使用3D库。 Pygame并不支持许多3D功能 因此,您必须自己创建它们。纯粹创造它们 python很可能不够快。
  2. 将pygame与PyOpenGL一起使用。使用显卡进行图形计算要快得多。
  3. 使用numpy进行大型数值计算。 Pygame非常支持numpy和numpy是一个针对大型数据集的优化数值库。
  4. 更改算法。预先计算常量,从内循环中删除检查,不使用函数来改变单个像素(你极少改变一个像素,而python中的每个函数调用都会给你带来轻微的开销),缓存值(每次访问)到python中的数组或成员访问成本)并且可能尝试将数据分配给块中的像素数组(因为每个赋值都需要转换数据)。这样做可能会加快速度。
  5. 请改用C / C ++。 Python很棒但有其局限性。如果你想创建一个没有第三方库的60 fps运行的3D游戏,那么Python是不够的。