2

私はj2meで開発しており、キャンバスを使用していくつかの画像を描画しています。

さて、私の質問は、以下のサンプルコードの描画速度の違いは何ですか?

領域の長方形を切り取った後の描画:

g.clipRect(x, y, myImage.getWidth(), myImage.getHeight());

g.drawImage(myImage, x , y, Graphics.TOP | Graphics.LEFT);

g.setClip(0, 0, screenWidth, screenHeight);

クリップなしの描画:

g.drawImage(myImage, x, y, Graphics.TOP | Graphics.LEFT);

最初のものは速いですか?画面にたくさん描いています。

4

3 に答える 3

2

さて、あなたの質問への直接の答えは、私が恐れているムーです-あなたは間違った方向から問題にアプローチしているように見えるからです。

つまり、クリッピングAPIは、パフォーマンスの考慮/最適化を目的としたものではありません。その目的の完全な範囲はAPIドキュメント(オンラインで入手可能)にありますが、パフォーマンスへの影響に関連するものは何も記載されていません。

クリッピング

クリップは、グラフィックスレンダリング操作によって変更される可能性のあるグラフィックスオブジェクトの宛先にあるピクセルのセットです。

オブジェクトごとに1つのクリップがありGraphicsます。グラフィック操作によって変更されるピクセルは、クリップ内にあるピクセルのみです。クリップの外側のピクセルは、グラフィック操作によって変更されません。

現在のクリップを特定の長方形と交差させたり、現在のクリップを完全に設定したりするための操作が提供されています。

架空のパフォーマンスを考慮してクリッピングAPIを使用しようとすると、コードが将来のメンテナにとって理解するのに悪夢になります。この将来のメンテナはあなた自身かもしれないことに注意してください、ほんの数週間/数ヶ月/数年後-私はしばらく前に自分のコードではっきりと理解できる意図なしに書かれた私の鼻を壊しました-私を信じてください、それは貧弱なコードをいじるのと同じように痛いです他の誰かによって書かれました。


誤解しないでください。特定のデバイスでは、特定の場合にクリッピングがパフォーマンスに大きな影響を与える可能性があります。さまざまなMIDP実装があれば、すべてが可能です。何を知っていますか?他のデバイスに逆の影響を与える可能性さえありますが、そうではありません。

もし(if)が起こった場合、if(if)が何らかの形で特定のパフォーマンスへの影響を明確に、しっかりとテストし、証明した正当化を得るでしょう-それから(then)、先に進み、必要なパフォーマンスに到達するために必要なトリックを実装します。ひねくれているかもしれません(BTDTGTTS)。ただし、それまでは、頭に浮かぶ可能性のある根拠のない仮定をすべて削除してください。

それまで...ただ。落とす。それ。

開発者は、正当な理由でコードを最適化するのが大好きです。とても満足で楽しいです。しかし、いつ最適化するかを知ることははるかに重要です。残念ながら、開発者は一般に、アプリケーションのパフォーマンスの問題が実際にどこにあるかについて恐ろしい直感を持っています...ほとんどのパフォーマンスチューニングは、通りでキーを紛失したにもかかわらず、キッチンでキーを探している人についての古いジョークを思い出させます。キッチンの方が明かりがいいから…(ブライアン・ゲッツ

于 2012-07-17T19:55:47.703 に答える
1

これはほぼ確実にプラットフォーム間で異なり、実際に描画する量によって異なります。

1秒あたりのペイント数、つまりペイント方法の平均時間を記録し、これを画面にペイントして、パフォーマンスを自分で測定することをお勧めします。

于 2012-07-17T11:03:15.990 に答える
0

2つのクリップメソッドを呼び出さないという単純な理由から、クリップなしの描画はどのプラットフォームでも高速になるはずです。しかし、私は尋ねるかもしれません、なぜあなたは最初にクリップを使用しているのですか?

同じファイルにアニメーションスプライトまたはアイコンバリエーションがある場合は、通常、クリッピングを使用します。この場合、フレーム/アイコンごとにファイルを作成できます。これにより、jarファイルのサイズが大きくなり、これらの画像をメモリに保持するためにより多くのヒープスペースが使用されますが、描画は高速になります。

于 2012-07-17T12:10:21.220 に答える