微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决有没有更快的方法来检查 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):

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。