Pygame - 表面淡入/淡出

4
我正在编写一个应用程序,在PyGame窗口上显示消息列表;为了使界面更美观,我决定为文本添加一个漂亮的淡入/淡出效果。

问题是:SDL只允许像素或表面透明度,而不是两者兼备。所以我编写了一个函数,根据期望的“图层”不透明度重新计算像素透明度,但它当然非常、非常、非常慢(即使在2.7GHz的核心i7上,帧率仍降至约10FPS):
def apply_alpha(surface, alpha):
    for x in xrange(surface.get_width()):
        for y in xrange(surface.get_height()):
            color = surface.get_at((x, y))
            color.a = int(color.a * alpha)
            surface.set_at((x, y), color)
    return surface

完整示例在此处:https://gist.github.com/rshk/5072173(不是真实应用程序,只是相关示例)

有没有什么方法可以加速处理速度?我看到可以直接访问底层缓冲区,这样可以避免实例化Color对象,但似乎以这种方式更新alpha时甚至更慢,调用BufferProxy.write()方法。

也许使用硬件加速会有所帮助?我认为理想情况下,在将表面粘贴到背景时应用alpha,但我对这种事情并不是很专业。

注意:更改文本颜色并不是一个机会,因为背景可能不总是黑色。


2
为什么不创建另一个表面?这样你就可以访问每个表面的alpha通道了... - Xymostech
我尝试过,但似乎没有效果。 - redShadow
你是对的,我再试了一次,在这个例子中它可以工作!我怀疑在“现实世界”的应用程序中有一些标志存在问题。感谢您的建议! - redShadow
1个回答

6
作为将来可能有用的参考,我按照@Xymostech的建议做了以下操作:创建另一个与呈现文本大小相同的表面,并在该表面上应用alpha,使用.set_alpha()
更新版本在这里:https://gist.github.com/rshk/5072375

好想法。说实话,我不认为文本需要这样做,因为它实际上没有自己的 alpha 通道,所以你可以只是设置_alpha,但这看起来非常有用。 - trevorKirkby

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