Rukeの日記
ホームページ最新月全表示|携帯へURLを送る(i-modevodafoneEZweb

2003年11月
前の月 次の月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
最新の絵日記ダイジェスト
2005/03/03 ブログー
2005/02/27 サンデーメガネ
2005/02/24 リッタイシ
2005/02/23 アメノイワヤト
2005/02/21 ホムパゲ

直接移動: 20053 2 1 月  200412 11 10 9 8 7 6 5 4 3 2 1 月  200312 11 10 9 8 月 

2003/11/18(火) ニジューフリコ
やっとここまでこぎつけた。スレッドあたりが自身ない。
http://f18.aaacafe.ne.jp/~ruke/TDFH/TwoDegreeOfFreedomHuriko.htm

ソース(SimpleImage関係はこれから使うようなので関係なかったり)
http://f18.aaacafe.ne.jp/~ruke/TDFH/TwoDegreeOfFreedomHuriko.java

実行にもコンパイルにもJAVA 2の環境がいります。
http://java.sun.com/j2se/1.4.1/ja/download.html
あたりからおとしてください。ブラウザでJAVA 2のアプレットを動かしたいだけの人は、各国語対応でWindows用のJREで十分です。

とゆうか私が今更になってやっとJAVA2の開発環境を入れたのですが。

ちなみに、DonutPとかのIEコンポーネントを使っているブラウザは、JAVA2 Plug-inを入れてもMicrosoftのJAVA VMを使い続けることがあります。私のドーナットもそうでした。このような場合、

regsvr32 /u msjava.dll

を"ファイル名を指定して直接実行"やコマンドプロンプトから行えばいいそうです。

こうするとインターネットオプションの詳細設定タブにJAVA(Sun)って項目が出てきます。私の場合上記の操作でこのチェックは入った状態になりましたが、入っていなければ入れましょう。

その項目のすぐ下にMicrosoft JAVA VMの項目がありますが、SunのPlug-inが優先されます。

これで逆にMicrosoft JAVA VMが使えなくなりますが、ど〜しても元に戻したければ、-uオプションを抜かして先程のコマンドを実行します。
--------------------------------------------------
この上に書いたのは昨日の内容だった。同じファイル名でアップロードしてあるので、現在の進行状況が同じurlから参照できたり。
とはいえ昨日のより見た目は悪くなっている。しかしやっとピクセル単位のエフェクトがけができるようになった。

自前の描画処理を入れたら物凄く遅くなった上に、スレッド間の不同期が原因とみられる不自然なちらつきが見られた。よくわからないままにいろいろいじっていて、とりあえずWindows環境では不自然でない(というかいろいろいじっていたら相当高速になった)ようにできた。

やったことは三つ。

一つはガベージコレクタに頼りまくって、
Canvas=FadeImage.clone();
みたいなことを毎ループごとやらせていたのだが(Canvas、FadeImageとも自作のSimpleImageクラスで画像を単なる配列として保持している)、これだとガベージコレクションのタイミングで猛烈な負荷がかかる(つまりゴミがたまりまくる)ので、copyメソッドを実装した。何しろ中身が単なる配列のクラスなので、これくらいはちゃんとやるべき、ということか。

もう一つはスレッド内で
try{
synchronized(this){
while(!getShouldExit() && getShouldSuspend()){
System.out.println("TDFH thread now suspending...");
wait();
}
}
}catch(InterruptedException e){}
とサスペンドフラグを見に行く部分で、synchronizedブロックを作るだけで物凄く遅くなるようだったので、ループ毎でなく一定時間ごとに見に行くことにした。

最後に、メインの処理を記述したメソッドをスレッドオブジェクト(こいつはAppletクラスの内部クラスにしてある)内に記述していたのだが、これをAppletクラスの内側に直接記述しpaint()から呼び出させるようにして、スレッドオブジェクトのrun()ではrepaint();するのみとした。

二つ目と三つ目は何で効果があるのかわからないのだが、とにかくかなりの効果があった。

特にいろいろいじっていて、repaint()は単なるupdate(Graphics)の呼び出し手続きのラッパではないような感じを受けた。どこかにイベント処理を行っているスレッドがあって、そこからpaint()が呼び出され、呼び出し元とは独立に処理が行われるようだ。このあたりのことが記述されているドキュメントを探したいところだ。

ところで今回スレッドに関してはアプレットクラスにimplements Runnableするというのが、ドキュメントにも出てくるしスレッドのサンプルも多くはこれを使っているけれど、なんだか急場しのぎに作られたっぽい手段のようで嫌な感じがしたので、Threadクラスを内部クラスとして作った。

この内部クラス内で、内部クラス自身を取得する目的でthisを使って見た所はねられた。それで調べて見ると
クラス名.this
と書くらしい。

これ、thisが自分。this.thisが自分を含んでいるクラス。って規定するのが素直じゃないだろうか。クラス名はオブジェクトじゃないだろう。

それで気になったのはこの内部クラス内で
synchronized(this)
が通ったということだ。しかも
synchronized(クラス名.this){
while(!getShouldExit() && getShouldSuspend()){
System.out.println("TDFH thread now suspending...");
wait();
}
}
と書くとモニタじゃないよん、みたいな感じの例外が発生する。thisを用いると大丈夫だ。
この辺りどうなっているのかよくわからない。


 Copyright ©2003 FC2 Inc. All Rights Reserved.