開発日誌
今月の写真:浜辺には…
このページについて
このページは 過去の日記 - 2005年9月 です。
最新の日記・他の月の日記
2005年9月25日(日)
授業が本格化する前に…。

 徐々に発表の場である学祭が近づいてきました。そのため、現在急いで作業を進めています。何回かここで書いた、画面転送が遅い問題は、ATIのRADEON9000との相性でした。グラボを外して、オンボードのIntel845Gで動かしたところ、5ms程度になりました。

 一昨日は、TThreadクラスのFreeOnTerminateプロパティがTrueの時に、継承したデストラクタが呼び出されないことが原因で起きていたものを始めとする数々のメモリーリーク潰しに追われていました。昨日は数式(中間記法)の式を2分木にして計算するクラスを作成。現在はそのクラスを実際に使う部分を作っています。

 今、作成しているプログラムは大学のサークルの方で発表してしまうため、たぶんここで公開することはないでしょうが、使い捨てタイプのプログラムではないので、再利用した物をここで公開することがあるかもしれません。

2005年9月20日(火)
Operaが完全フリーに

 今まで、ライセンス登録をしなければ広告表示だったOperaですが、バージョン8.5からライセンス登録なしでも広告が表示されなくなりました。ブラウザはIEしか使ったことがないと言う人は是非ダウンロードしましょう。

 ということで、今回は自分のOperaの設定を紹介しようと思います。

○ツールバー関連
ページバー アドレスバー ステータスバー(下)
アドレスバーに、ズームボタン、画像の表示非表示、ユーザーモード切替を配置
パネル、メインバーは非表示

○操作関連
マウスジェスチャー有効
センタークリックは新しいページで開く

 ツール→外観の設定またはMy Operaからダウンロードできるスキンも試してみるといいと思います。

2005年9月18日(日)
Delphiの本体でエラー?

モジュール 'coreide60.bpl' のアドレス 0052700C でアドレス 000000B4 に対する読み込み違反がおきました。
モジュール 'vcl60.bpl' のアドレス 40110C48 でアドレス 00000018 に対する書き込み違反がおきました。

 昨日からこのようなエラーが出始め、IDEからプログラムを実行できなくなりました。変更を加えたところをコメントアウトしてみたりしましたが、エラーが出たり出なかったり。前にDLLのブレークポイントが設定できなかった時に、再インストールしたら直ったことがあったので、再インストールしたところ、今は正常に動いています。

 インストールしていて気づいたのですが、Updateパッチを1つ当て忘れていた可能性が…。

2005年9月15日(木)
エラー報告を送った成果か?

 データの破損でXPを再インストール後に入れていなかったLogitechのQcamドライバーをインストールしました。ローカルに残っていたドライバーをインストールしたので、再インストール前にいつも出ていたエラーが発生…。(NVIDIAのユーティリティと相性が悪い?)いつものようにWindowsのエラー報告画面で「報告する」をクリックして送信すると、以前と違って、関連情報が付いて返ってきましたが、間違えて閉じるボタンを押してしまいました。関連情報が返って来るのは、おそらくドライバーの更新通知だろうと、Logicoolのウェブサイトに行くと…2005年8月付けの最新バージョンのドライバーを発見。今度はエラーが出なくなりました。

 エラー報告をするといいことがあるかもしれませんよと、ただそれだけです。

2005年9月12日(月)
ネイビーミッション

 先週の土曜日、メタクロの第4弾がついに出ました。ネイビーミッションはシンプルな3Dシューティングゲームです。メニュー画面はフロントラインを思わせます。フロントラインやバーガーメーカーに比べると、少しやり込み要素に欠けるような気がしますが、しばらくはバージョンアップが行われるようなので、改善されると思います。個人的には、レーダーと当たり位置による(ダメージ、効果等の)変化があるといいかな…と。主砲で飛行機を狙うと面白いです。(結構撃ち落とせます。)

 プログラミングはと言うと、例の部室のPCは、DirectXのバックバッファをシステムメモリに置いても、ATIのドライバを更新しても改善する気配はありません。次は、BitBltをSynchronizeしたサブスレッド内からメインスレッドに移動させてみようかと思っています。

 動きを定義するスクリプトファイルにXMLを使うことにしました。(階層構造があるので、INIのようなファイル形式を使えないので。)そこでXMLを扱うクラスを探してみたのですが、見つかったのが、高機能な(余計な機能が多い)もので、使えそうもありません。(注 Delphi6 PersonalなのでVCLのXML関連の機能が省かれています。)ということで、以前のHTML読み込みクラスを改造して使うことにしました。改造と言っても、<XXX />のようなタグが扱えればいいので、仮実装だったHTMLの部分の補強がメインだったりします。

2005年9月9日(金)
写真ページ公開の裏話

 今までのページは、TABLEタグを使ってレイアウトを作っていたのですが、写真ページではDIVタグ+CSSでレイアウトを作っています。開発日誌にも書きましたが、IEで崩れたりMozillaで崩れたりで微調整が大変でした。スタイルシートの使い方もかなり改善しています。DIV依存症も離脱できたかな…。

 HTML4.01Strict対応にしたので、AmazoneのアソシエイトのIFRAMEタグをOBJECTタグで置き換えようとしたのですが、OBJECTタグの表示の仕方がブラウザによってかなり違うので諦めました。

2005年9月7日(水)
V903TとV803T

 発表されましたね。どこかで噂されていた通りの内容でしたが…。903Tは…V902Tのマイナーバージョンアップでしょうか…。GPSが付いただけというだけなのか…。803Tは、どこからどう見ても音楽携帯というものですが、果たして使い勝手は…。地元のヨドバシにデモ用実機が配備されたら確認してみます。

 そういえば、昨日au版ツーカーSが発表されていますが、やはりサービス統一でツーカーSが使えなくなる時(PDCサービスの終了)への対策なのでしょうか…。

2005年9月6日(火)
数日分をまとめて…

 画面転送に使う関数を切り替えられるようにしたバージョンを作り、テストしてみました。手元のPCでは、十分に高速で変化が現れないので、旧PCをMEで起動して試してみました。結果、関数の違いによる影響はなく、転送だけで46msもかかっています。

 面白いことにPen4 2.53 + RADEON 9000のPCがBitBltに20~30msを要しているのに対し、Duron650MHz + Matrox Millenium G400のPCではTransferは11ms。OSは共にWindows2000です。

 上記のPCで展示をするので、特に前者のPCでの実行が不安です。そこで、画面転送を高速化すべくOpenGLを使ってみました。Delphi6でOpenGLを使っての画面転送の実装は比較的簡単でした。(Bitmapを転送するときにBGRAカラーの定数が宣言されておらず、BCC付属のヘッダーファイルからコピーしたりしましたが…)

 このOpenGL版を旧PC(ME)で実行してみたところ、転送になんと300msも…。(新PCは2,3ms)旧PC(XP)では、画面に描画されさえもしません。部室のPCでのテストは木曜にします。

 OpenGLでは解決できなさそうな気がしてきたので、最後はDirectX 7です。DelphiでDirectXと言えば、QuadrupleDです。DirectX 7を使うために旧バージョンの2.13aを使用しました。しかし独自のバックバッファを用意しているため、DirectXのバックバッファが無駄になってしまいます。VSyncAtWindowed=Falseに設定した状態で、旧PC(XP)ではBitBltと同程度でした。

 BitBlt、DrawDibSection、OpenGL、DrawDIBDrawをコンパイル条件で切り替えられるようにしたので、もう少し考えます。

 メタクロの新作がそろそろ公開されるようです。(現在はVector公開待ちだとか…。)

2005年9月3日(土)
問題点続出

 今日も現在作成中のプログラムの話題です。作成中の記事は、画像の加工が終わって、現在本文を作成中です。明日こそは…。

 全体の処理をUpdate、Draw、Transferの3段階に分けて、どこに時間が掛かっているかを調べてみました。Updateは座標などの更新、Drawはバックバッファへの描画、Transferは画面への転送(Bitblt関数)です。Drawに時間が掛かっているのが全体の速度が遅い原因だと思っていたのですが、旧PCで調べて見たところ、800x600の画像の転送でTransferに30msもかかっていました。Bitbltはマシンの性能以外でも影響するようで、大学の部室のPC(Pentium4 2.53 + Intel845G + RADEON9000 + Windows2000)ではコマ落ちするのに対して、その他の2GHz台のWindowsXPではコマ落ちすることはないのですが…。

 そこで転送方法を変えてみます。Bitblt以外にはSetDIBitsToDeviceというものがあるようです。(詳しくはMSDNのサイトで…。)DelphiではTABitmapをCreateするとHandleTypeプロパティがbmDIBになっているので、他に手を加える必要はなさそうです。

 SetDIBitsToDeviceを使うにはBITMAPINFO構造体を取得しなければいけません。TBitmapの中に隠れてしまっているので取り出す方法がないのかと探していると、Graphicsユニットの中にGetDIB関数がありました。ピクセルデータは必要ないので、ダミーの変数を渡しておきました。SetDIBitsToDevice関数の引数でピクセルデータへのポインタが必要ですが、これはTBitmapのScanLineプロパティで取得できます。ただし、左下からピクセルデータが格納されているので、ScanLine[高さ-1]を変数に保存して、引数に指定します。

 結果は翌日の日記で…。

2005年9月1日(木)
9月になりました…

 相変わらず、プログラミング&DelphiのProfessionalを買うためのバイトをする日々です。今日は変数付きの式を計算する電卓プログラムを作りました。変数の値を変えても、最低限の処理で再計算できるようになっています。今のところ、逆ポーランド法で記述した式しか扱えなかったり、計算用2分木の最適化機能を付けていなかったりするのですが、とりあえずこの状態で、作成中のプログラムに組み込もうかと…。

 昨日、Web上でOpera 10周年パーティがありその中でOperaの広告削除キーの無料配布イベントがありました。窓の杜で、このイベントに気づいたときには、すでに22時を回っていたのですが、無事に広告削除キーを取得できました。現在は広告が無くなり非常にスッキリしています。一体何時まで広告無しで使えるのだろうか…。

 先週末から、公開すると言っていた記事は未だ2/3です。工事中ページを作って、先に公開してしまおうか…。