使用数组存储窗口的像素

时间:2013-01-18 02:24:40

标签: python arrays numpy pixel

对于游戏窗口中的每个像素,是否有可能(在性能方面)拥有一个包含每个像素一个8位整数的单个多维数组?我需要根据这个数组及时更新游戏窗口。

我的目标是以下内容:

import numpy
window_array = numpy.zeros((600, 600), dtype=numpy.int8)

#draw the screen
for (y, x), value in numpy.ndenumerate(window_array):
    if value == 1:
        rgb = (0, 0, 0)
    elif value == 2:
        rgb = (50, 50, 50)
    blit_pixel(x, y, rgb)

我想要达到30-60 FPS,但到目前为止,我的测试已经产生的结果太慢了,即使是糟糕的帧速率也无法运行。有可能吗,如果可以,怎么做?

1 个答案:

答案 0 :(得分:0)

我从来没有使用过pygame,所以带上我的anwser一粒盐......

也就是说,如果你使用python循环迭代360,000像素并在每个像素上执行python函数调用,那么你似乎不太可能获得任何不错的帧速率。

我从this other question(阅读评论主题)了解到,pygame.surfarray模块将为您提供对包含实际屏幕数据的数组的引用。 pygame.surfarray.pixels3d应返回对形状(rows, cols, 3)数组的引用,其中最后一个维度在屏幕上保存RGB值。使用该引用,您可以直接更改屏幕上的像素,而无需执行类似以下操作的python循环:

import numpy
surf_array = pygame.surfarray.pixels3d(surface)
window_array = numpy.zeros(surf_array.shape[:2], dtype=numpy.int8)
...
surf_array[numpy.nonzero(window_array == 1)] = np.array([0, 0, 0])
surf_array[numpy.nonzero(window_array == 2)] = np.array([50, 50, 50])

不确定是否需要拨打pygame.display.update来实际显示您的更改,但这种方法可以维持比您想象的更高,更高的帧速率。