last update: 2013/09/03

2004/12/21

Javaでぽわわ

いよいよ今年も残すところ10日ですね。なんか今年はあんまり煮詰まってなくて全然実感がありません。

さて、月曜火曜と集中講義の最後を終え、もう今年の作業はほぼ終わった感じです。研究のプログラムの方もとりあえず今年の分はもうこれでコードフリーズということにして、あとは放置してたドキュメント書きをやってここ3ヶ月分の成果をまとめておこうかな、と。

てことで、コードフリーズ前の微調整をやって、さっさと帰ろうと思いつつ例によってちょっと友人にちょっかい出しにいったんですが、Javaプログラムで詰まってるようで、ちょっと雑談ぽわぽわしながら見てみることに。

画面に書いた結果出力画面をBMPあたりで保存したい、ということのようだったんですが、なにせJavaですからねぇ(注:kawazoelはJava嫌い)。これが普通にWin32APIだったら、画面のデバイスコンテキスト取得! コンパチビットマップをメモリ上に作成! BitBltでメモリにコピー! それをビットマップにして保存! とかまぁこんな感じなんですが、なにせJavaだからわけわかんない。

…で前回(いつ)もリファレンス読んで「ごめん、わかんねー」って投げ出してたんですが、今回のオレはちょっと本気だったので(なにそれ)、リファレンスをもうちょっとマジメに読んでみたら、なーんだ、描画モデルはやっぱりデバイスコンテキスト系描画らしいのでWindowsAPIライクな概念を使ってそのままいけそう。

ってことで、今までの「背景画像を画面に書き、その上にルートデータとかを直接画面に書いていた」というのを直接画面行きではなくメモリ上のバッファに書くようにし、バッファに書いた結果を画面に転送というスタイルにして(まぁダブルバッファリングとかも考えるとこの方がいいよね)、画像を保存する際はそのバッファを保存、という形にしたらいいんじゃないかという話に。

JavaではGraphicsとかいうのがデバイスコンテキスト、Imageがイメージの抽象オブジェクトらしいので、要はcreateImageしてメモリ上にバッファを作り、そこからgetGraphicsして描画コンテキストを取得、そのGraphicsで今まで画面に書いてたのと同じ処理をすればcreateImageしたイメージに描画出来るから、描画関数の最後でそのイメージへの描画が終わった時点でそのイメージをそのまま画面のGraphicsへdrawImageすればOK、と。

昔からシステムプログラミングは好きだけど描画関係が絡むととりあえずお手上げ、というスタンスの私だったんですが(とりあえずCUI大好き主義)、今までだましだまし使ってたWin32API(っていうかWinGDIだね)の描画の他に今年に入ってからGTK+プラットフォーム、GLUTプラットフォーム(まぁ要はOpenGLだ)、そしてJavaの描画コンテキストにまで触れたりして、今年はなんかプログラムでの描画系にかなり親しんだ1年だったという感じでしょうか。描画関係はどうしても苦手意識があったんですが、いざやってみると実はどうってことなかったりするものですね。

…にしても、やっぱりJavaの全部newしないとオブジェクト作れないっていうのは慣れないなぁ…。何回かコンパイルエラー出したときは全部C++スタイルでインスタンスを定義して怒られてたわけで、まぁJavaの変数は全部参照変数だからnewして作らなきゃだめなんだよ、と分かってても絶対忘れてC++スタイルで書いちゃう。っていうか毎回newnewするのが面倒なわけで、やっぱりオレにJavaはあわねーわー。読み書きぐらいはできるけど。

comments powered by Disqus