- PR -

スレッドの作成と実行

投稿者投稿内容
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-02-02 17:58
例えば、ブラウン管ではインタレースって言うんでしたっけ?走査線を交互に表示させる
という方法がありますよね。1秒間に全ての点を描画する、という固定観念を捨て、
人間が見ても違和感が無いレベルまで描画点数を少なくしてしまうのはどうでしょうか。
一生懸命頑張って描画しても、人間の認識できるスピードより早ければ骨折り損の
くたびれ儲けになってしまいそうです
しろ
会議室デビュー日: 2004/02/02
投稿数: 12
お住まい・勤務地: 都内
投稿日時: 2004-02-02 18:16
インギさんおばけさん返答ありがとうございます。

>for文で間に合わない処理ならスレッドに分けると
>もっと遅くなりますのでやはり間に合いません。

これは知りませんでした。。
もうちょっと勉強してみます^^;
みなさんご教授ありがとうございました。

とりあえず、実行できるレベルまで完成したらまた書き込みたいと思います
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2004-02-02 18:20
スレッド云々の前に、とりあえずアニメーションの表示方法について調べた方がよろしいかと思います。

おそらく、0.1秒(でなくてもよいでしょう)ごとに「画面内容を書き換えるメソッド」を呼び出すスレッドを作るだけで済みます。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-02-02 18:24
ちょっとソースに目を通したのですが、674本のスレッドというのは、それぞれがベストエフォートでGraphics#drawLine()を繰り返しコールし、1ピクセルずつを記述するという仕組みになっている、という構造であると理解してよいでしょうか?

例えば1コマあたり1/24秒(高品位なテレビアニメはこのくらいだったという覚えが…)とし、コマ間の差分を画面に書いていくようにすると良いのではないでしょうか?1/24秒毎に描画しなければならないパス情報の集合を、アニメーション開始前にあらかじめ生成しておいて、1/24秒ごとに一括で描画、というような仕組みにしてはいかがですか?1ピクセルごとに描画(画面に転送)するより、速度的にも有利かと思います。

java.awt.Shape、java.awt.geom.GeneralPathクラスあたりが助けになると思います。
参考になれば幸いです。

[ メッセージ編集済み 編集者: シュン 編集日時 2004-02-02 18:44 ]
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2004-02-02 18:27
引用:

しろさんの書き込み (2004-02-02 17:05) より:

for 文で674回ループさせるとした場合には、
アニメーションは0.1秒ずつで200回表示されます。


詳しくは分かりませんが、リフレッシュレートの関係上、多くても1秒間に100回くらいで良いのでは無いでしょうか?
しろ
会議室デビュー日: 2004/02/02
投稿数: 12
お住まい・勤務地: 都内
投稿日時: 2004-02-02 18:47
びしばしさん、ぼんさん、ぼんさんまとめて失礼します。
返答ありがとうございます。

アプレットの成功のイメージとしては
http://www.enveng.titech.ac.jp/midorikawa/W70709.html
このイメージのような感じなのですが、(直リンクで申し訳ない)
0.1秒というのは仕様になっているので変更が利かないもので^^;
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-02-02 19:49
リンク先を拝見しましたが、私のパソコンでは現実の世界で2秒か3秒ごとに
表示上0.1秒進んでいますね。
単にこの手のシュミレーションで0.1秒刻みで表示するだけでしたら、
本当に現実の世界の0.1秒に合わせて表示すれば、あっというまに過ぎ去って
何も見えないと思いますが。

もしスレッドをお使いになるのでしたら、グラフの表示で1スレッド、ユーザか
らの入力待ちで1スレッド、場合によってはその他の表示用で1スレッドという
感じでスレッドを分けるのがよろしいのではないかと思います。

Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-02-02 20:12
どうも、Wataです。
私だったら、Appletのpaintをオーバーライドして、そこで普通に二重forループを使って、全てのピクセルを一括描画する処理を書きます。そして、ThreadまたはTimerをつかって、0.1秒ごとにrepaint()をコールし、次のデータを描画させるようにします。
というか、そうしないと、各ピクセルごとの描画の同期が取れないと思います。

つまり、Y座標ごとにスレッドを持つと、それぞれがばらばらに描画を行うので、あるY座標の線は、開始から2秒後の情報を表示しているのに、そのすぐ下はまだ、1秒後だったり、他の位置では既に終了しているかもしれなくなります。
(スレッドの機能を使って同期を取ることもできますが、そんなことすればますます遅くなります。)

引用:

しろさんの書き込み (2004-02-02 18:47) より:
アプレットの成功のイメージとしては
http://www.enveng.titech.ac.jp/midorikawa/W70709.html
このイメージのような感じなのですが、(直リンクで申し訳ない)
0.1秒というのは仕様になっているので変更が利かないもので^^;


0.1秒というのは描画するデータが0.1秒単位で実時間にあわせて描画するということですよね。実際にAppletでアニメーションが間に合うかどうかは、とりあえず作ってみるのがいいと思いますね。一括描画でVolatileImageを使えば、結構いけるのではないでしょうか?

# 少しだけ試してみたところ、0.1秒レートはやっぱかなり無謀な気がしました...
# なんて無責任発言だ (汗


[ メッセージ編集済み 編集者: Wata 編集日時 2004-02-02 20:45 ]

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