- PR -

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

投稿者投稿内容
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-08-20 16:17
引用:

Casperさんの書き込み (2003-08-20 14:17) より:
現在、処理番号2の10枚のパネルのrepaint()の時点で、前の文字列と新しい文字列が重なってしまっているのです。つまり文字列スクロール処理の前の段階で既に重なってしまっているのです。



ということは、スクロール処理がなくても、つまりスレッド関係のコードを除去した状態でも文字が重なっているということですか?

#追記
Casperさんのコードだと、paint()内部では画像で上書きし、文字Numberを書いているだけなので、他の部分でpanel.getGraphics()して描画しているとか、すでに画像に文字が含まれているとかでないかぎり、文字が重なるはずはないのですが・・・


[ メッセージ編集済み 編集者: ocean 編集日時 2003-08-20 16:28 ]
ant
ベテラン
会議室デビュー日: 2002/07/11
投稿数: 51
投稿日時: 2003-08-20 17:04
グラフィックチップとかモニタの種類、周波数とかにもよるんじゃないでしょうか?
1回キーイベント拾ったら描画が終わるまで次のキーイベントを破棄するとかじゃだめなんでしょうか?
とっても的外れな気がしますが・・・
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-08-20 17:49
Ken-Lab様、ocean様、とも様、ご意見ありがとうございました。

Ken-Lab様より引用**************************************************************
>当方でも実験プログラムを書いて確認していますが、毎回画面が崩れています。
本当にお手数かけます。m(_ _)m
毎回画面が崩れるのは私と違いますね・・・

>他に何か崩れないような工夫をしているところはありませんか?
特に無いと思われます。
>8月8日付けの私のソースではこのような問題は発生しませんか?
手の空いた所で見てみようと思います。
せっかくの皆様のアドバイスに私がついていけてない・・・
******************************************************************************

ocean様より引用****************************************************************
>ということは、スクロール処理がなくても、つまりスレッド関係のコードを除去した状態でも
>文字が重なっているということですか?
ハイ、そうです。
>文字が重なるはずはないのですが・・・
ハイ、私もそう思っていたのですがKen-Lab様のようなご意見もありました。
*******************************************************************************

とも様より引用******************************************************************
>グラフィックチップとかモニタの種類、周波数とかにもよるんじゃないでしょうか?
>1回キーイベント拾ったら描画が終わるまで次のキーイベントを破棄するとかじゃだめなんで
>しょうか?
>とっても的外れな気がしますが・・・

イエイエ、私もハードの疑いを捨てきれないのです・・・
*******************************************************************************


未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-08-20 19:17
引用:

Casperさんの書き込み (2003-08-20 17:49) より:
>当方でも実験プログラムを書いて確認していますが、毎回画面が崩れています。
毎回画面が崩れるのは私と違いますね・・・
(途中省略)
イエイエ、私もハードの疑いを捨てきれないのです・・・


ウーン、こちらでの再現実験では200x100pxぐらいの絵を入れ、更にスクロールバーを使って
イベントの発生を増やしているため、ひょっとすると発生頻度が違うような気がします。
既に実施されていると思いますが、開発機上ではより過酷な状態にしてみる
(サイズの大きい絵を入れてみるか、スリープ時間を短く(10mSecとか)してみて
症状が再現されるかどうかを確認してみる必要があるかもしれないと考えます。

ハード>
この状況から察すると処理が重いためではなく、とも様のご指摘やデバイスドライバのバグが
原因している可能性は考えられるかもしれません。

# 一般論ですが、たとえCPU負荷100%になったとしても、描画が遅れるのは
# 仕方ないですが、崩れる方向に行くのはよろしくないと考えます・・・。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-08-20 19:20 ]
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-08-20 19:35
気になる記述を見つけたのですが・・・そもそも、パネルってフォーカス可能なんでしょうか?

ここにて、
引用:

ピアがフォーカス可能かどうかは実装で決定されます。サン・マイクロシステムズ社では、特定のネイティブプラットフォームのすべての実装に対して、フォーカス特性が同じピアの構築をお勧めします。Windows および Unix については、キャンバス、ラベル、パネル、スクロールバー、スクロール区画、ウィンドウ、計量コンポーネントに対してはフォーカス不可能なピア、それ以外のコンポーネントについてはフォーカス可能なピアをお勧めします。


これを読むと、パネルがフォーカス可能かは実装しだいだが、Sunとしてはフォーカス不能なように推奨しているようです。

実はこのような疑問を持ったのは、下のコードが 1.4 では思ったようにフォーカスするのに、1.2 では Panel#0 にフォーカスしたまま、マウスでクリックしても、うんともすんとも言わなかったためです。

コード:

package test;

import java.awt.*;
import java.awt.event.*;

class MeApp
{
public static void main(String[] args)
{
final MeFrame f = new MeFrame();

f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});

f.pack();
f.show();
}
}

class MeFrame extends Frame
{
public MeFrame()
{
setLayout(new GridLayout(2, 5, 5, 5));

for (int i = 0; i < 10; ++i)
{
add(new MePanel("Panel#" + i));
}
}
}

class MePanel extends Panel // コンテナである必要はないので、Component で十分?
{
private static final Font _font = new Font("Serif", Font.BOLD, 20);

private final Image _image1;
private final Image _image2;
private final String _text;

private Image _currentImage;
private String _currentText;

public MePanel(String text)
{
enableEvents(AWTEvent.FOCUS_EVENT_MASK);

_text = text;

_image1 = Toolkit.getDefaultToolkit().createImage(getClass().getResource("1.jpg"));
_image2 = Toolkit.getDefaultToolkit().createImage(getClass().getResource("2.jpg"));

final MediaTracker tracker = new MediaTracker(this);

tracker.addImage(_image1, 0);
tracker.addImage(_image2, 0);

try
{
tracker.waitForID(0);
}
catch (InterruptedException e)
{
throw new Error(e.getMessage());
}

handleFocus(false);
}

public Dimension getPreferredSize()
{
return new Dimension(94, 100);
}

public void paint(Graphics g)
{
g.setFont(_font);
g.drawImage(_currentImage, 0, 0, 94, 100, null);
g.drawString(_currentText, 15, 50);
}

protected void processFocusEvent(FocusEvent e)
{
switch (e.getID())
{
case FocusEvent.FOCUS_GAINED:
handleFocus(true);
break;
case FocusEvent.FOCUS_LOST:
handleFocus(false);
break;
}

super.processFocusEvent(e);
}

private void handleFocus(boolean value)
{
if (value) // focus gained
{
_currentImage = _image2;
_currentText = "Focus";
}
else // focus lost
{
_currentImage = _image1;
_currentText = _text;
}

repaint();
}
}





[ メッセージ編集済み 編集者: ocean 編集日時 2003-08-21 08:59 ]

[ メッセージ編集済み 編集者: ocean 編集日時 2003-08-21 10:21 ]
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-08-20 19:56
このような記事も見つけました。

引用:

AWTフォーカス・サブシステムの旧リリースには、コンポーネントのタイプ -- 軽量または重量 -- や、Java仮想計算機のホストとなっているプラットフォームの種類によって動作が一貫していないという問題がありました。重量コンポーネントでは、独立したネイティブ・ウィンドウ (AWTコンポーネント) を使ってレンダリングが行われるため、そのネイティブ・フォーカス・システムに依存することになります。

ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-08-20 20:41
マウスイベントで、フォーカスをまねてみました。当然不格好ですが・・・(スレッド安全性は考慮していません)

#よりよい実装があることがわかったため、削除しました



[ メッセージ編集済み 編集者: ocean 編集日時 2003-08-22 13:49 ]
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-08-20 23:41
サンプル公開を中止しました。

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

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