- PR -

アニメーションの高速表示

投稿者投稿内容
キモ
会議室デビュー日: 2005/08/23
投稿数: 5
投稿日時: 2005-08-23 16:10
こんにちは。

アニメーションを高速に表示させる方法は無いものかと探しています。
具体的にはアナログメータを表示させるパネルを作りたいのです。

現在行っている方法は

1.BufferedImageで背景画像(メーターパネル)を作成(1度だけ)
2.背景画像を画像1にコピー
3.画像1に針を描写
4.画像1をdrawImageで描写

これを繰り返しているのですが,CPUに負荷がかかりすぎるのです。

できたら,レイヤのようにして背景画像を一度パネルに描写して,
上のレイヤの針を消したり描いたりするだけで済む方法はないかと考えています。

私としては1/10秒ごとの表示で綺麗に表示出来るようにしたいのです。
どなたか良い方法を知っている方がいましたら教えてください。
よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-08-23 16:20
スレッドダンプを繰り返しとればどこらへんで特に時間がかかってるかすぐわかるかと思います。

おそらく画像をコピーするところが重いのではないでしょうか。
針を消す作業を、画像のコピーではなく、針の部分だけ上塗りするような処理にはできないでしょうか。
キモ
会議室デビュー日: 2005/08/23
投稿数: 5
投稿日時: 2005-08-23 16:53
返信ありがとうございます

スレッドダンプは行ったことが無いので,すぐに確認することは出来そうに無いです。

私としても,画像のコピーはやらないほうが軽くなるとは思っているのですが,
針を消す際にどうしても目盛りや目盛りの値などが一緒に消えてしまうため画像にすることに至ったのです。針のあった部分だけ描くような処理はかなり厄介そうなんですよね。
透明度をうまく使って,針だけを消せたらいいんですけどね。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2005-08-23 19:30
まずは、
使用しているJavaのバージョン。
実行環境のスペック(CPU, メモリ, OS)
を、提示してください。単にスペックが低すぎることが要因かもしれないからです。

再表示のトリガーは何でしょうか?
タイマー制御で、100msec毎にrepaint()を発行しているのでしょうか?
それでも、描画が追いつかないということでしょうか?

背景画像のサイズ(幅X高さ)はどれくらいでしょうか?かなり大きな画像なのでしょうか?

メーターは背景をすべて埋め尽くすくらい大きく表示されるのでしょうか?
それとも、一部だけでしょうか?もしそうなら、クリッピングして、再表示領域を小さくすることが可能となります。

Javaのバージョンが1.4以降なら、VollatileImageで表示の高速化を図ることが可能です。

ほかの高速化手法として、トリプルバッファを用いることで、高速化がはかれるかもしれません。

余りにも提示された情報が少なすぎる為、明確な回答を与えることは難しいです。
キモ
会議室デビュー日: 2005/08/23
投稿数: 5
投稿日時: 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前後
ということで劇的な変化は期待できなさそうなので却下。

私としては、細かなテクによる高速化よりも、背景が固定といった特徴を使って根本的に無駄を省いた方法があるのではと思って投稿したのですが、無いのでしょうかね。
背景用のパネルの上に針用のパネルを重ねてなんて・・・無理ですよね。
BUBU
会議室デビュー日: 2002/09/02
投稿数: 6
投稿日時: 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/23
投稿数: 5
投稿日時: 2005-08-24 11:50
たしかに無駄と言われればそれまでなんですよ。
テレビアニメも1秒間に30コマですからね。

ただ,表示と同時に他の計算処理も行いたいので,
たとえ1/10にしたとしても表示のための負荷をもっと減らしたいのです
全ては少しでもカッコよくしたいがためです
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 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の描画を直接やってはいかがですか。

スキルアップ/キャリアアップ(JOB@IT)