对于游戏窗口中的每个像素,是否有可能(在性能方面)拥有一个包含每个像素一个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,但到目前为止,我的测试已经产生的结果太慢了,即使是糟糕的帧速率也无法运行。有可能吗,如果可以,怎么做?
答案 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
来实际显示您的更改,但这种方法可以维持比您想象的更高,更高的帧速率。