使用数组来存储窗口像素

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帧每秒的效果,但是目前我的测试结果非常慢,甚至无法获得不良帧率。是否有可能做到这一点,如果可以,该如何实现?


你应该看一下OpenCV的Python模块是如何工作的 - cv2模块。我认为它使用(R, G, B)元组的numpy数组。 - Alex L
有没有使用类似于pygame或pyglet的方式来完成它的方法? - Dan Doe
我没有使用过pygame/pyglet。这只是一个建议,你应该探索一下cv2的工作原理,看看pygame是否有类似的功能 :) - Alex L
1个回答

0

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

话虽如此,如果您正在迭代360,000个像素并在每个像素上执行Python函数调用,则似乎很难获得任何合理的帧速率。

我从另一个问题(阅读评论线程)中了解到,pygame.surfarray模块将为您提供引用实际屏幕数据的数组。 pygame.surfarray.pixels3d应返回形状为(行,列,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 来实际显示您的更改,但这种方法将比您原先想到的能够维持更高的帧速率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接