4

PyGameウィンドウに表示されるメッセージのリストを表示するアプリケーションを作成しています。物事をより美しくするために、テキストに素敵なフェードイン/フェードアウト効果を追加することにしました。

問題は次のとおりです。SDLでは、ピクセルごとまたはサーフェスごとのアルファのみが許可され、両方は許可されません。そこで、必要な「レイヤー」の不透明度に基づいてピクセルアルファを再計算する関数を作成しましたが、もちろん非常に非常に低速です(コア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を呼び出してアルファを更新するのはさらに遅いようです。BufferProxy.write()

たぶん、ハードウェアアクセラレーションを使用した何かが役立つでしょうか?ここでの理想は、表面を背景にブリットしながらアルファを適用することだと思いますが、私はこの種のことについてはあまり専門的ではありません。

注:背景が常に黒であるとは限らないため、テキストの色を変更することはできません。

4

1 に答える 1

6

これは誰かの将来の参照として役立つ可能性があるため、@ Xymostechによって提案されたように行いました。レンダリングされたテキストと同じサイズの別のサーフェスを作成し、を使用してそのサーフェスにアルファを適用します.set_alpha()

ここで更新されたバージョン:https ://gist.github.com/rshk/5072375

于 2013-03-02T18:26:15.347 に答える