私はJavaで透過性のある画像を扱ってきました.1つのことは、この種の画像(ばかげている)がパフォーマンスに影響を与えることです.
例: 背景が白の画像を描画している場合、100fps になります。透明な背景を持つ同じ画像に変更すると、30 fps にダウンします。
インターネットで検索すると、いくつかの解決策が見つかりましたが、見つからなかったのはその説明です。誰かがなぜこれが起こるのか説明してもらえますか?
私はJavaで透過性のある画像を扱ってきました.1つのことは、この種の画像(ばかげている)がパフォーマンスに影響を与えることです.
例: 背景が白の画像を描画している場合、100fps になります。透明な背景を持つ同じ画像に変更すると、30 fps にダウンします。
インターネットで検索すると、いくつかの解決策が見つかりましたが、見つからなかったのはその説明です。誰かがなぜこれが起こるのか説明してもらえますか?
どのコンテキスト画像が含まれているのかわからない(swing? awt? slick2d? javaFX? lwjgl?)ので、代わりに原則として回答します。
Java は通常、JIT が開始される前に解釈される (これは一部のプラットフォームでのみ発生します) ため、CPU を多用する操作は他の言語よりもはるかに明白です。
それぞれの上に積み重ねられた画像を表示する必要がある単純なケースに向かいましょう。それらは便利な 1 次元です。
鍵:
[CAMERA]
自明です|
カメラからの想像上の光線です:
部分的に透明なピクセルを通過した後の光線です。単一の不透明な画像の最も単純なケースを扱いましょう:
[ CAMERA ]
||||||||||
RGBRG
最良のケースでは、画像をビュー バッファにコピーしてスケーリングするだけです。次に、複数の画像に:
[CAMERA]
|||||||||||||
|||RGBRGB||||
||| ||||
YYYYYYYYYYYYY
この場合、ビューは黄色を変換後にバッファーにコピーし、上部の画像で覆われたすべての領域を塗りつぶすことができます。
さて、透明のために:
[CAMERA]
|||||||||||||
|||RG||GB||||
||| || ||||
YYYYYYYYYYYYY
ここでは、バッファをコピーすることはできません。上の画像のすべてのピクセルをチェックする必要があり、透明度に応じて条件付きでオーバードローするかどうかを判断すると、パフォーマンスが低下します。
これは基本的な概要であることに注意してください。実際のケースでは、これははるかに複雑で最適化されています。
部分的な透明度 (完全なアルファ チャネル) に関しては、これはさらに悪いことです。
[CAMERA]
|||||||||||||
|||RGggGB||||
||| :: ||||
YYYYYYYYYYYYY
ここでわかるように、部分的に透明な中央のピクセルの下の色を決定する必要があります。このようなピクセルごとに完全なブレンド計算が必要であり、斜めの場合、レンダリング戦略に応じて複数のピクセルが含まれる可能性があります。これは、ここに示したすべての操作の中で明らかに最もコストのかかる操作です。