Pygame - 表面渐显/渐隐
我正在写一个应用程序,它会在PyGame窗口中显示一系列消息。为了让界面看起来更好,我决定给文字添加一个渐变的淡入淡出效果。
问题是:SDL只允许每个像素或每个表面的透明度,但不能同时使用这两种方式。所以我写了一个函数,根据想要的“层”透明度来重新计算每个像素的透明度,但这样做非常非常慢(即使是在2.7GHz的i7处理器上,帧率也降到了大约10帧每秒):
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
对象,但通过这种方式更新透明度似乎更慢,因为要调用BufferProxy.write()
方法。
也许使用硬件加速会有所帮助?我觉得理想的情况是在将表面绘制到背景时应用透明度,但我对这方面的知识不太多……
注意:改变文字颜色是不行的,因为背景不一定总是黑色……
1 个回答
6
为了将来有人参考,我按照@Xymostech的建议做了:创建了一个和渲染文本大小一样的表面,然后在那个表面上应用透明度,使用了.set_alpha()
。