3

对于游戏窗口中的每个像素,是否有可能(在性能方面)拥有一个每个像素包含一个 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 的速度运行,但到目前为止,我的测试产生的结果太慢了,即使在糟糕的帧速率下也无法运行。有可能吗,如果可以,怎么做?

4

1 回答 1

0

我从未使用过 pygame,所以请对我的 anwser 持保留态度...

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

我从另一个问题(阅读评论线程)中了解到,该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])

不确定是否需要调用 topygame.display.update来实际显示您的更改,但这种方法将维持比您想象的高得多的帧速率。

于 2013-01-18T03:51:08.410 回答