对于游戏窗口中的每个像素,是否有可能(就性能而言)有一个包含每个像素一个 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,但到目前为止,我的测试产生的结果太慢了,即使在糟糕的帧率下也无法运行。是否可以这样做,如果可以,怎么做?
最佳答案
我从未使用过 pygame,所以请对我的答案持保留态度...
也就是说,如果您使用 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
来实际显示您的更改,但这种方法将维持比您想象的高得多的帧速率。
关于python - 使用数组存储窗口的像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14391504/