- - PR -
アニメーションの高速表示
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-08-23 16:10
こんにちは。
アニメーションを高速に表示させる方法は無いものかと探しています。 具体的にはアナログメータを表示させるパネルを作りたいのです。 現在行っている方法は 1.BufferedImageで背景画像(メーターパネル)を作成(1度だけ) 2.背景画像を画像1にコピー 3.画像1に針を描写 4.画像1をdrawImageで描写 これを繰り返しているのですが,CPUに負荷がかかりすぎるのです。 できたら,レイヤのようにして背景画像を一度パネルに描写して, 上のレイヤの針を消したり描いたりするだけで済む方法はないかと考えています。 私としては1/10秒ごとの表示で綺麗に表示出来るようにしたいのです。 どなたか良い方法を知っている方がいましたら教えてください。 よろしくお願いします。 |
|
投稿日時: 2005-08-23 16:20
スレッドダンプを繰り返しとればどこらへんで特に時間がかかってるかすぐわかるかと思います。
おそらく画像をコピーするところが重いのではないでしょうか。 針を消す作業を、画像のコピーではなく、針の部分だけ上塗りするような処理にはできないでしょうか。 |
|
投稿日時: 2005-08-23 16:53
返信ありがとうございます
スレッドダンプは行ったことが無いので,すぐに確認することは出来そうに無いです。 私としても,画像のコピーはやらないほうが軽くなるとは思っているのですが, 針を消す際にどうしても目盛りや目盛りの値などが一緒に消えてしまうため画像にすることに至ったのです。針のあった部分だけ描くような処理はかなり厄介そうなんですよね。 透明度をうまく使って,針だけを消せたらいいんですけどね。 |
|
投稿日時: 2005-08-23 19:30
まずは、
使用しているJavaのバージョン。 実行環境のスペック(CPU, メモリ, OS) を、提示してください。単にスペックが低すぎることが要因かもしれないからです。 再表示のトリガーは何でしょうか? タイマー制御で、100msec毎にrepaint()を発行しているのでしょうか? それでも、描画が追いつかないということでしょうか? 背景画像のサイズ(幅X高さ)はどれくらいでしょうか?かなり大きな画像なのでしょうか? メーターは背景をすべて埋め尽くすくらい大きく表示されるのでしょうか? それとも、一部だけでしょうか?もしそうなら、クリッピングして、再表示領域を小さくすることが可能となります。 Javaのバージョンが1.4以降なら、VollatileImageで表示の高速化を図ることが可能です。 ほかの高速化手法として、トリプルバッファを用いることで、高速化がはかれるかもしれません。 余りにも提示された情報が少なすぎる為、明確な回答を与えることは難しいです。 |
|
投稿日時: 2005-08-23 20:52
環境はjava5.0
WinXP, CPU 1.5G, メモリ512M のノート 表示させるためにTimerTaskを使って一定時間ごとに示す値を更新 更新されるごとにrepaint() ひとつ間違えで、1/100秒ごとですね サイズは600x600 画像のコピーの際に、針が入るだけのサイズの矩形領域を指定してコピーするも、目で確認できる効果はなし。 VolatileImageについては http://www.javainthebox.net/laboratory/JDK1.4/Graphics/VolatileImage/VolatileImage.html の下のほうの VolatileImageTest3.html を実行した結果 VolatileImage : 330前後 Image : 270前後 ということで劇的な変化は期待できなさそうなので却下。 私としては、細かなテクによる高速化よりも、背景が固定といった特徴を使って根本的に無駄を省いた方法があるのではと思って投稿したのですが、無いのでしょうかね。 背景用のパネルの上に針用のパネルを重ねてなんて・・・無理ですよね。 |
|
投稿日時: 2005-08-23 22:20
> ひとつ間違えで、1/100秒ごとですね
モニタの更新頻度から考えて、1/60〜1/70以下の頻度での更新は無駄ではないでしょうか? 人間が見る事を考えると、1/100でちゃきちゃき動くものを正確に捉えるのが無理 だと考えて、1/15程度での更新で十分じゃないでしょうか?(テレビアニメもその程度 だと聞いています) 1/100でタイマーが動くだけで、かなりの負荷になりそうです。 で、どうしても気になる、という場合、 1回目の1/15でメータが50を指して、 2回目の1/15でメータが55になったとしたら、 2回目の描画の時に、50から55までタイマーを経由せずに、スムースに針を動かすと。 #後ろ向きな回答ですが… |
|
投稿日時: 2005-08-24 11:50
たしかに無駄と言われればそれまでなんですよ。
テレビアニメも1秒間に30コマですからね。 ただ,表示と同時に他の計算処理も行いたいので, たとえ1/10にしたとしても表示のための負荷をもっと減らしたいのです 全ては少しでもカッコよくしたいがためです |
|
投稿日時: 2005-08-24 12:09
まずは描画頻度を1/100ms程度に下げるのが、CPUコスト軽減の初手ですよね。
それから、BufferStrategyは試されました? ページフリッピングを利用した場合がJava描画を実施する際の最高性能になるはずです。それでもだめならJavaはあきらめてDirectXでも使ってください^^; http://www.javainthebox.net/laboratory/JDK1.4/Graphics/BufferStrategy/BufferStrategy.html それと、 >2.背景画像を画像1にコピー >3.画像1に針を描写 >4.画像1をdrawImageで描写 これは、ダブルバッファリングを自前で行う場合のロジックだと思いますが、 JDK1.4以降でSwingを使っていれば、変な設定をしない限りダブルバッファリ ングはライブラリが勝手にやってくれるので、そもそも必要ないはずなのですが… 画面コンポーネントのGraphicsに対して2〜3の描画を直接やってはいかがですか。 |