python - 使用数组存储窗口的像素

标签 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,但到目前为止,我的测试产生的结果太慢了,即使在糟糕的帧率下也无法运行。是否可以这样做,如果可以,怎么做?

最佳答案

我从未使用过 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/

相关文章:

python - 使用 virtualenv 进行结构部署 - 哪个用户?

python - 了解 Tkinter __init__ 中的父级和 Controller

arrays - 以最少的移动次数对数组进行排序

python - 计算 numpy 数组 python 中字符串出现次数的更快方法

python - 动画阻尼振荡器

python - Django 中特定于应用程序的默认设置?

python - 在 Python 中遍历模块的类(但不是导入)

javascript - 如何设置关联数组?

java - 如果一个数组被分配给一个对象引用,那么对象引用指向什么?

python - 如何更改 Numpy 中的二维数组元素?