有没有更快的方法来检查 pygame 表面的 list[i] 是否具有 alpha 0

问题描述

我正在 pygame 中制作一个精灵表类,我将从图像中获得的每一帧都放在一个列表中。 但是,有时精灵表有一些空帧。 例如我用 2 个精灵动画制作了一个图像,所以我把每一个都排成一行,但第一个比第二个大 1 帧,所以第二个有一个空帧。

我执行此代码是为了检查框架是否为空。我使用了一个反向循环,因为大多数空帧都在列表的末尾,所以我可以在任何帧不为空时中断,这样就不会花费太多时间。

for i in reversed(range(len(frames))):
    frame_alpha_as_array = surfarray.array_alpha(frames[i])

    if np.sum(frame_alpha_as_array) == 0:
        del(frames[i])
    else:
        break

但是,我想知道是否有更快的方法来做到这一点,这样它就不会占用太多的 cpu/gpu/ram (IDK)。

我对编程比较陌生,所以如果我做错了什么,不要太苛刻。

解决方法

使用 pygame.surfarray.pixels_alpha() 而不是 pygame.surfarray.array_alpha()pygame.surfarray.array_alpha() 将像素 alpha 复制到二维数组,而 pygame.surfarray.pixels_alpha() 直接引用像素 alpha。

参见pygame.surfarray.pixels_alpha()

的文档

创建一个新的 2D 数组,直接引用 Surface 中的 alpha 值(透明度)。对数组的任何更改都会影响 Surface 中的像素。 这是一个快速的操作,因为没有数据被复制。
此数组引用的 Surface 将在数组的生命周期内保持锁定状态。

使用numpy.any测试是否有任何数组元素大于0:

if not np.any(surfarray.pixels_alpha(frames[i]) != 0):