ブリッティング速度を上げますか?


9

私はPyGameの2Dサイドスクローラーで作業しています。マップごとに1つのテクスチャを使用します(これはテクスチャの実際のサイズです)。

マップテクスチャ

次に、次のコードを使用して画像を読み込みます。

sprite = pygame.image.load("Maps/MapTesting.png")
sprite.convert()
sprite = pygame.transform.scale(sprite,
              (sprite.get_width()*6, sprite.get_height()*6))

ご覧のように、テクスチャは6回爆破されて実際のマップテクスチャが作成されます。平均して、このテクスチャは約4500x800です。画面全体が汚れているため(横スクロールのおかげで)、このテクスチャはフレームごとに画面にブリットする必要があります。これは次のコードを使用して行います。

screen.blit(sprite, (0, 0),
(cameraposx, cameraposy, windowheight, windowwidth))

そしてそれは機能します。問題は、それがかなり遅いということです。まともなPCでわずか40 FPSを取得します。60FPSを目指しているのに、実際のAI /オブジェクトが何も実行されていません。どうすればこれをスピードアップできますか?


上記のコードはサニタイズされ、コンテキストから除外されていることに注意してください。完全なコードはここにあります:https : //github.com/nightcracker/PyGG2

最後に重要なことですが、上の画像は8ビットのように見えるかもしれませんが、ゲームにはより多くのビット深度を必要とする要素があります。


テクスチャごとに適切なサイズ、たとえばブロックごとに1024の幅に分割し、一度に関連する2つだけをブリットします。
Jari Komppa、2011

@JariKomppa:試してみましたが、ブリッティングには影響がありません(pygameは、私が指示する四角形だけをブリットするのに十分スマートです)、メモリ使用量だけです。
orlp 2011

あなたは... pygame(trollface.jpg)を使用することはできません.... jkjk、この場合、私はそれがあなたのスローダウンが起こっているところではないと思います、それを広範囲にテストしましたか?
ultifinitus 2011

@ultifinitus:はい、cProfileでプロファイルしました。
orlp 2011

実際の解像度で表示した場合の速度の違いは何ですか?大きな画像を事前計算するとどうなりますか?
ultifinitus 2011

回答:


7

(私の経験から)ピクセルをサーフェスにブリットすることに関する一般的な比較された最適化をリストアップします。

1)通常、ブリットされたときのパレットイメージ(インデックス付きイメージ)は、(カラーを取得するために)1レベルのリダイレクトが行われます。そのため、トゥルーカラーイメージと比較すると、ブリッティング時に遅くなります。

2)True Colorピクセルデータ(Alphaなし-say24ビットデータを想定)は、イメージの各スキャンラインに対してmemcpyを実行できるため(イメージの一部をコピーする場合)、デバイスのフレームバッファーに非常に高速にブリットできます。ブリットされるデータが完全な画像である場合、データ全体を直接memcpyすることができます。

3)アルファピクセルデータのブリットは、各コンポーネントの結果の計算を含み、RGBデータに再度パックする必要があるため、最もコストがかかります。簡単に言えば、最終的な色を取得するための各ピクセルの操作が増えます!

Finalrgb = Alpha*(Srgb) + (1-Alpha)*Drgb (this is for normal blend equation)
    where Srgb is source-rgb (we need to apply for each of the component for final color)
       Drgb is the color that will be there in the destination buffer.

私はこれまでpyGameに取り組んだことがありません。しかし、そのソースコードをざっと見てみると、内部で「sdl」Blit関数を使用していると思い込ませます。通常、Sdl blitは非常に高速で最適化されるため、上記の点を無視して、もう一度プロファイルを作成してください!幸運を!

* 更新: *カラーキーの設定は、各ピクセルをサーフェスにブリットするときに1つの追加チェックを追加するようなものです。このようなもの-

       for(eachPixelColor in allPixels)
         {
            if(eachPixelColor is NOT colorKeyColor)
            {
              copy color to the frame buffer!
            }

         }

したがって、ここに表示されている場合、各ピクセルの色の有効性をチェックする必要があるため、memcpyを使用しないように制限されています。


わかりset_colorkeyました。マップテクスチャにスリップインして、(高価な)アルファチャネルを呼び出します。これをconvert修正しました。今はこのがらくたPCで150 FPSの安定版を実行しています。ありがとう!
orlp 2011

ちょっとそれを追加するのを忘れていたとしても、カラーキーに関連して編集します:D
Ayyappa

5

sprite.convert() あなたが思っていることをしていません。

sprite = sprite.convert() 必要なものです。


うーん、私はsprite = sprite.convert()実際のコードにも持っています:)
orlp

ああ、いいね。:)その場合、pygameの代わりにpygletを使用するか、OpenGLに慣れている場合は直接pyOpenGLを使用することを検討する以外に、提供できることはあまりありません。
カイロタン2009

@キロタン:グッドキャッチメイト!私はそれをチェックしていません:)
Ayyappa '30 / 09/30

または、さらに良い:sprite = pygame.image.load("Maps/MapTesting.png").convert()
MestreLion 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.