Pygame - 表面淡入/淡出

red*_*dow 4 python pygame sdl

我正在编写一个应用程序,显示PyGame窗口中出现的消息列表; 为了让事情变得更漂亮,我决定为文本添加一个很好的淡入/淡出效果.

问题是:SDL只允许每像素或每表面alpha,而不是两者.所以我编写了一个函数,根据所需的"图层"不透明度重新计算像素alpha,但它当然非常非常非常慢(即使在核心i7 @ 2.7GHz上,它也会下降到~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
Run Code Online (Sandbox Code Playgroud)

这里有完整的例子:https://gist.github.com/rshk/5072173(不是真正的应用程序,只是一个相关的例子)

有什么方法可以加快速度吗?我看到可以直接访问底层缓冲区,避免实例化Color对象,但是以这种方式更新alphas似乎更慢,调用BufferProxy.write()方法.

也许使用硬件加速的东西有帮助吗?我认为这里的理想是在将表面涂抹到背景上时应用alpha,但我对这种事情并不是很专业.

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

red*_*dow 6

因为这可能会成为某人作为日后参考,我照建议的@Xymostech:创建一个呈现的文本的大小相同的另一面,并应用该表面上的α,使用.set_alpha().

更新版本:https://gist.github.com/rshk/5072375