- PR -

効率の良い描画方法とは?

投稿者投稿内容
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-08-18 10:23
Ken-Lab様より引用*************************************************************
>ちらつきですが、updateメソッドを入れても解消しませんでしたか?
ハイ、下記のようにしましたがちらつきは解消されませんでした。
public void update(Graphics g) {
 paint(g);
}

現在、フォーカスの取得&損失時に行っていたrepaint()を外してテストを行っております。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-08-18 12:09
引用:

下記のようにしましたがちらつきは解消されませんでした。
コード:
public void update(Graphics g) {
 paint(g);
} 





全く変化がなかったですか?それともいくらかの効果が見られましたか?

AWTコンポーネントは再描画の際、update()メソッドでクリップ領域を削除した後、
上書きします。上のように記述すれば、クリップ領域の削除がない分、いくらかの効果が期待できると思うのですが。オフスクリーン描画も行っているようだし...

更なる効果をあげる方法として思いつくのは、クリップ領域を制限して、再描画を実行することぐらいです。

こんな感じ...
コード:
repaint(x, y, width, height);



表示させるコンポーネントってそんなに大きいサイズなのですか?


かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-08-18 12:16
関係ないかもしれないですが、GCが頻発して、
描画が間に合わないってことはないですよね。

私が作っているプログラムで、やけに描画が遅いので、調べてみたらGCが頻発していたという経験があったので、この当たりの状況についても一応聞かせてください。

[ メッセージ編集済み 編集者: かずくん 編集日時 2003-08-18 12:16 ]
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-08-18 13:38
かずくん様、ご意見ありがとうございました。

かずくん様より引用**************************************************************
>全く変化がなかったですか?それともいくらかの効果が見られましたか?
元々update()メソッドによりちらつき防止は行っており、描画は崩れますがちらつきはありませんでした。しかし"clearRect()"を入れた後はちらつきが発生してしまいました。

>表示させるコンポーネントってそんなに大きいサイズなのですか?
いえ、絵の張られるパネルの一枚の大きさは200×30です。

>GCが頻発して、描画が間に合わないってことはないですよね。
すみません、"GC"とはなんでしょうか?・・・
*******************************************************************************
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-08-18 14:24
引用:

Casperさんの書き込み (2003-08-18 10:23) より:
>ちらつきですが、updateメソッドを入れても解消しませんでしたか?
ハイ、下記のようにしましたがちらつきは解消されませんでした。


お忙しい所、ご説明いただきありがとうございます。

横から割り込む形となって申し訳ありませんが、GC=ガベージコレクションですね。
簡単に表現しますと、参照されなくなったメモリー領域の開放を自動的に行う
システムです。(ただしGC発生のタイミングをコントロールすることは基本的に
できません。インスタンスを使いまわすようにするなどにより回数を減らすことが
できるかもしれませんが。)ちなみにGCはCPUパワーを食います。

話は戻りますが・・・。
ちょっと確認したいことがありまして、repaint()を外した状態と、clearRect()を
入れることにより何か改善された点はあったのでしょうか?(例えばちらついていても
崩れない、とか。対応した結果を合わせてより詳しくご連絡いただけると次へのアドバイスを
もっと早く手にすることができるんじゃないかとオモワレマス。)

# ここまでで改善されないとなると、どこかでオブジェクトや変数が書き換わっているか、
# jdk1.2特有の問題、か・・・??

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-08-18 14:36 ]
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-08-18 15:25
Ken-Lab様、直接の質問でない事までのご回答ありがとうございました。

Ken-Lab様より引用**************************************************************
>お忙しい所、ご説明いただきありがとうございます。
いえいえ、元々私がしっかりと説明できていればKen-Lab様にこのようなお手間はとらせずに済んだのですが・・・。

>repaint()を外した状態と、clearRect()を入れることにより何か改善された点はあったので
>しょうか?
まず、"clearRect()"を入れた後ですが、repaint()のタイミングでチラツキが発生するのですが前の文字列が残っている事はなくなりましたので描画が崩れる事もありません。

次にフォーカス取得&損失時のrepaint()を外した結果ですが、やはり前の文字列が残ってしまい、その上に新たな文字列が書かれてしまい重なってしまいます。

>どこかでオブジェクトや変数が書き換わっているか
調べてみます。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-08-18 16:52
ども、ほむらです。
-------------------
引用:

はい。例えばフォーカス取得時、新たな文字列を描画しスクロール開始するのですが、
描画が失敗しているのか古い文字列が残ったまま、その上を新しい文字列がスクロールして
しまいます。


えと。。ちと確認なのですが。。。。
changeImage()はsyncronized(?)で同期が取れるようになっていますか?
ほかにも、オフスクリーンの画像の書き換えに関する部分は
同期が取れていますでしょうか?

なんとなく、画像を更新している最中に
スレッドの画面更新が入っているようなそんなイメージがちらほらと。。。。

# 僕も勉強がてらチャレンジしてみようかな〜
# どこまで出来るか自信がありませんが(笑
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-08-18 22:25
引用:

Casperさんの書き込み (2003-08-18 15:25) より:
>repaint()を外した状態と、clearRect()を入れることにより何か改善された点はあったので
>しょうか?
まず、"clearRect()"を入れた後ですが、repaint()のタイミングでチラツキが発生するのですが前の文字列が残っている事はなくなりましたので描画が崩れる事もありません。

次にフォーカス取得&損失時のrepaint()を外した結果ですが、やはり前の文字列が残ってしまい、その上に新たな文字列が書かれてしまい重なってしまいます。


状態が良くわかりました。あとはupdateメソッドが生きれば何とかなりそうな感触ですが、
これまで調べた内容と実際のものと異なる点としては、直描きしているか、パネルの上に
描いているかの違いがありそうですね。一応、そのあたりをこちらでも確認してみたい
と考えています。

# 追記です。関連性は低いような気がしますが
# 読み込む画像フォーマットはどんな形式でしょう?(GIF, PNG or JPG? JPGであれば
# 形式はどんなものでしょうか?

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-08-19 08:08 ]

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