4

我正在编写一个应用程序,显示 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

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

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

也许使用硬件加速的东西会有所帮助?我认为这里的理想是在将表面粘贴到背景上的同时应用 alpha,但我在这类事情上不是很专家..

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

4

1 回答 1

6

由于这可能作为某人未来的参考,我按照@Xymotech 的建议做了:创建另一个与渲染文本大小相同的表面,并在该表面上应用 alpha,使用.set_alpha().

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

于 2013-03-02T18:26:15.347 回答