今のPCのCPUはCore2 Duoなんだが,WorldTesterを実行するとCPU使用率50%で頭打ちになる。これは1つのスレッドで全て処理しているため,CPUを1つしか使わないから。そこで実験的に画面上のオブジェクトを半分ずつ別スレッドで処理するようにしてみた。具体的には,起動時にスレッドを複数生成し,当たり判定と物理演算処理を先程のスレッドにキューイングするように実装した。が,結果的には性能が1.2倍程度,CPU使用率最大70%くらいにしかならなかった。スレッド間で1つでも排他制御を入れるとシングルスレッドの方が早くなっちゃうし,複数のCPUを極限まで使い切るのは結構奥深いらしい。
‘プログラミング’のエントリ
ウェザタイとWorld TesterのVista 64bit版ネイティブ対応をやっていた。World TesterについてはDirectX9対応すればネイティブ動作可能だった。ウェザタイについてはDirectMusicが64bit非対応なのでできなかった・・・って古いバージョンは未サポートとかではなく完全に使えないですか。そうですか・・・。音なしでも起動できるようにしないと。
ちなみに64bitネイティブ化する利点は・・・特にない。てか多分公開すらしない。
I・O DataからUSB2-PCADPGのVistaドライバが公開されていた。さらにVista x64版も公開されていたのでついでに入れてみる。これでx64でもある程度生活できるかも。やる意味があまりないけど。
新ノートが来てからWeather TypingとWorld TesterのVista対応,Visual Studio 2005対応,Unicode対応,64bit対応をやっている(つまり機能追加の全くないバージョンアップ)のだが,Vista対応はちゃんとやろうとすると難しい。問題は主に2つ。
1つ目はUAC。管理者権限でもProgram Filesなどが書き込み禁止になるというもの。MS推奨的にはユーザごとに異なるデータはAppDataに入れよ,とのことなんだろうが,フリーソフトとしてはアンインストールが面倒になるので辛い。市販ソフトは普通アンインストーラがあるのでMS推奨通りにやればいいんだろうけど,フリーソフトはたいていデスクトップとかドキュメントフォルダにダウンロードしてその場で展開,いらなかったらそのまま削除,といった手順になると思う。でも設定をAppDataに入れてしまうと,まずデータを消してからプログラムを削除になって面倒になる。結局今は中途半端な策として,プログラムがProgram Filesなどに入っていたら設定は書き込まない方針で実装中。つまりVistaに仮想化されて変な場所にファイルができたり,ファイルに書き込めなくて落ちるといったことだけはないようにする,と。インストーラのないフリーソフトのためのもっといい方法はないのかなあ。
2つ目はUIPI。アプリケーションごとに(というかカーネルオブジェクトごとに)権限が決められていて,自分より高い権限には手出しできないというもの。これに影響を受けるのは…ロビーの自動退席機能。ロビーを起動しておいて,例えば1分間マウス,キーボード操作がなかったら状態が「退席」になるという機能だが,UIPIによって,ロビーを起動中に管理者権限のアプリケーションで作業をしていると,マウス,キーボード操作をしていても「退席」になってしまう。対策するとしたらどうやるんだ。電子署名とManifestでいいようなことも書いてあったりするけど,フリーソフトで電子署名は無理っぽいし,マウスとキーボードドライバでも書くしかないのか。って64bitだとドライバにも電子署名必須だし。てことで現状こういう制限にするしかないと。
最近Vistaで休止状態やスリープから復帰するとブルースクリーンになっていた。カーネルメモリダンプをデバッグしてみてUSB関連ということは分かったので1つずつUSBデバイスを外していったら結局USBマウスが原因だったっぽい。このメーカーのUSBマウスなのかUSBマウス一般なのか分からないけど。
# その後マウスを抜いていてもブルースクリーンになったのでこれが原因ではないかも。
ウェザタイのUnicode化をやってみる。ライブラリとWorld TesterのUnicode化は既に終わっているのだが,ウェザタイは日本語をたくさん扱うのでかなり面倒。
MFCアプリケーションのデバッグをやっているのだが,以前はMFCのソースコードデバッグが行えたのだが,VC2005 SP1上ではアセンブリになってしまう。確か以前はMFCのソースの場所を聞いてきたのだが,VC2005 SP1ではPDBファイルに書いてあるパスしか読み込めないっぽい。XPのときはどうだったかなあ。
World Tester。ウィンドウサイズの変更サポートとズーム機能の改善をしてみた。今使っているノートは画面が1920×1200となかなか広い。この画面でさすがに640×480はないよなあ,ということでウィンドウサイズを動的に変更できるようにして,さらに設定保存できるようにした。で,画面を広くしたらオブジェクトがでかすぎたりするようになったので,ズーム機能を改善することに。今まではカメラのパラメータをいじって無理矢理拡大,縮小してたのだが,やりすぎると画面が歪んでしまう。そこで,オブジェクトの方を拡大,縮小するようにして自然な感じにした。
ついでに,現バージョンでは影が真っ黒になっていたので半透明にした。
趣味プログラミングはエンハンスするときにがんがんリファクタリングできるのがいい。機能を加えるたびにコードがすっきりしていっている気がする。これが仕事だったら怖くてリファクタリングできないからどんどんコードが汚くなっていくという。
PCの性能が良くなったので開発を再開。前のノートではVisual Studio2005を使っているとインテリセンスの更新でちょくちょくCPU100%になっていたのだが,今のノートではマルチコアのおかげか全く気にならない。てかマルチコア,マルチCPU前提の作りな気がする。
Vista発売ってことで。ホントは1月中にDenasuのソフトのVista対応版を出そうと思ってたのだが,特に今のままでも問題なさそうなのでそのままにしている。唯一の注意事項として,プログラムをProgram Filesとかに入れてしまうと記録ファイルとか設定ファイルとかがC:UsersxxxxxAppDataLocalVirtualStoreProgram FilesWeatherTypingみたいな変な場所に保存されてしまうので,c:WeatehrTypingとかデスクトップとかに入れること,というのがある。本来ならユーザごとのフォルダに入れるのが正しいんだろうけど,このくらいの規模のソフトだったら,そこまでやるとかえってうっとおしいので変えない方針。「よくある質問」に追加しておこう。
Weather Typingの記録が反映されないという指摘をメールで頂いた。これは不正ツール対策で,特定条件を満たすと記録を反映しないようにするという内部仕様のためだが,質問がくるということは通常でも発生するということなので,次バージョンでは緩和するか,他の対策をとる方針。詳しくは「よくある質問」のところに記載したのでそちらを参照。
結構前からランキングのCGIが頻繁に落ちていたのだが,原因判明。ランキングの一番下に,全記録を1ページで表示するリンクがあったのだが,それをクリックすると落ちる。多分処理に時間がかかってフリーズしたと思われたか,ページがでかくなりすぎたんだろう。なのでひとまずリンクを外しておいた。一応「表示数」を調整すれば1ページの表示数は調整可能なので,そちらで好きな数を入れて下さい。最大500件までに変更したのであんまりたくさん表示できないけど。
さて,ちゃんと対策するとしたらどうするのがいいんだろう。処理を速くするとかJavaにするとかはひとまず置いといて,HTTP+Perlでは一気に1ページ出力しないといけないし。CGIで206とか返してもいいのかな。
Visual Studio 2005 SP1をあててみる。テレビを観ながら入れてたら6時間かかった。調べてみると普通のマシンでも数時間かかるとか。何してるんだろう。それはともかくVista用パッチを早く出して欲しい。
MSDNの会員証が届く。ぺらぺらの紙切れからカードになっていた。
Vistaインストール完了。とりあえずWeather TypingとWorld Testerは、Program Files以外にインストールしていれば普通に動く。Program Filesにインストールしている場合、仮想フォルダにリダイレクトされるので記録ファイルはどこ? みたいな感じになる。これだとあえてVista版を作る必要はないかな。まあとりあえず一通りの機能を試してみないと。
ちなみにInspiron8100のビデオドライバ(GeForce2 Go)はXP用がそのまま使えた。Smart Vision Pro2 for USBは、C:Program Filesにインストールするとおかしな動きをするのでc:SmartVisionとかにすれば動くことは動く。割と不安定だけど。AirEdge AH-N401Cは確かインストーラではじかれたので、ドライバを直接入れれば使えた。
# 2006/12/16 Smart Vision Pro2 for USBは結局UAC関連でちゃんとは動かない。無理矢理な方法もあるにはあるけど…。
で、Vistaでテストするためにロビーサーバを荒らしていたのだが、どうもbeanfanが落ちている模様。例によって管理人と連絡が取れるまでは止まったまま。ロビーサーバは第2サーバがあるので特に問題はない。ワードサーバはしばらく止まると思う。
4号にWorld Testerを試してもらったが,爆発が気になるとのこと。以前のバージョンではパラメータが固定だったので爆発することはほとんどなかったはずだが,今回のバージョンは巨大な力を加えたりできるので,めり込みが起きたり,めり込みすぎると反発力が強く働きすぎて爆発が起こる。これを直そうとするとスピード(めり込まないように時間の最小単位を十分小さくする)と物体の大きさ(小さい物体だとめり込みやすいので大きい物体しか作れないようにする)が犠牲になるわけだが,今は安定性よりいろいろパラメータをいじれる楽しさを優先している。根本的に数値計算の精度を上げられればいいんだけど…。
まあそうはいっても爆発するのはなんかやな感じなので,めり込みすぎたら潔くすり抜けるようにしてみた。どっちもどっちな感じもするけど,とりあえずもう少しテストしたら開発版にアップする予定。
World Tester。万有引力を実装したものを開発版に置いてみた。これにともなって,今まで重力をmgで求めていたのを万有引力定数と地球の質量,半径から求めるように修正。
調子に乗って太陽と地球をシミュレートしようとしたが,スケールが合わなくて断念。今のWorldTesterでは球の最小半径が3cmくらい(そういえばマニュアルに書き忘れた。重要な制限事項なのに…)なので,地球を3cmにしても太陽が3mくらいでばかでかくなるし,軌道半径も350mくらいになってしまう。そもそも1回転するのに1年かかるし。てことでボール2つが回っているだけのサンプルを追加。追加する前に重力を0にしておくこと。
World TesterをVectorに登録してみた。World Tester
最近(?)ランキングがCoreを吐いて落ちている。CGIだから何もなかったかのように続いているんだが,何だろう。「最近おかしいよ」っていう情報があれば知らせてもらえるとありがたいです。
平成教育委員会で無重力振り子の実験をやっていた。WorldTester付属の振り子は回転しないようになってるので平成教育委員会のようにはならない。てことで回転するようにしたバージョンも作って開発版に置いてみた。ジェット機をチャーターしなくてもPCで実験できるのがいいところ。
物理シミュレータ World Tester1.1を公開。物体を定義できるようにし,サンプルもいろいろ追加してみた。今後はDenasuサイト上でピタゴラ装置みたいなのを公開していけるといい,なあ。
ここまでで最初の構想は実装できたのでVectorにでも登録してみようかな。といってもどのカテゴリになるのかよく分からない。
ウェザタイランキング。本人からのメールがあって重複記録を削除した。
WorldTester。今まで衝突判定の前処理に境界球による判定をしていたのだが,軸に沿った箱(AABB)判定に変えてみた。結果,一番効果のあったドミノ倒しで1.3倍くらいの速度向上になった。この後は空間分割をやって,オブジェクトが多い場合でも遅くならないようにしてみるか。
ランキングに変動が。えと,重複削除してもよろしければ,掲示板にでも連絡を下さるとありがたいです。
ぱじ氏から,WeatherTypingのWord3に「パンダ」が2つ含まれているとの情報が。確かに。パンダを重点的に練習すれば高得点への道が開ける! とかではなくて,チェック甘かったか。
WorldTesterの物体定義を外部ファイルでできるようにしてみた。結果,うーん,改造は簡単にできるけど,新規に作るのは難しいかも。とりあえずこれと,物理定数のカスタマイズができたら一旦公開の予定。
Visual Studio2005とVisual SourceSafeの組合せ。今までよく分からなかったのでほっといたのだが,この際なので設定してみた。以下の手順はメチャクチャに近いけど単にうまくいった,ってだけのメモ。この手順でVSSがおかしくなっても知りません,てことで。
- Visual Studio6.0のSP6を入れてVisual Source Safeを6.0dにする
- Visual Studio2005の[ツール]-[オプション]-[ソース管理]-[現在のソース管理プラグイン]から「Microsoft Visual SourceSafe」を選択。
- ソース管理したいプロジェクトをソリューションごと開く。
- [ファイル]-[ソース管理]-[ソース管理の変更]で「ソース管理の変更ダイアログ」を開く。
- ソリューションのバインドを解除して,再バインド。バインド先はVSS上のslnがある場所。
- プロジェクトのバインドを解除して,再バインド。ソリューション以下のパスにvsprojがある場合はそのままvsprojがある場所を選択。別の場所にある場合は,vsprojがある場所を設定しようとすると,「n個上の場所を指定してくれ」とか言われるのでn個上の場所を指定。
- 「保留中のチェックイン」を見ると,「ソリューション~下の項目」-「~の下のファイル」の下にいくつか(1個前の手順で出てきたnの個数だけある)フォルダアイコンがあって,その下にファイルが表示される。チェックインされる場所は,ソリューションやプロジェクトをバインドした場所から「保留中のチェックイン」に表示されている相対パスになる。っぽい。
要は「保留中のチェックイン」で表示されるソリューションアイコンやプロジェクトアイコンの場所が,「ソース管理の変更ダイアログ」で設定したバインド場所と同じであることさえ分かれば簡単な話なのだが,それが分かっていないとVSSの変な場所にファイルができたりして意味不明なことになる。
WorldTesterのカスタマイズをしようと思っていたらいつの間にかライブラリのUnicode化をやっていた。VisualC++2005だとUnicodeがデフォルトに設定されているのでやっぱりUnicodeにしたい感じがある。Windows98系で動かなくなっちゃうので公開するときはどうせMBCSなんだけど。
ついでにVisualC++2005でちゃんとビルドできるようにしてたんだけど,結構大変。1つはまったのが,ifstreamとofstream。以前はそのまま日本語のパスがOpenできたはずなのに2005でビルドするとOpenに失敗する。どうもちゃんとLocaleを設定しないとOpenできないらしい。
それにしてもすきあらばIntelliSenseを更新してCPUくいまくるのは何とかならないものか。
ずっと仕事ばかりなので最近ネタがない。それもどうかという感じがするので,WorldTesterのカスタマイズ機能でもサポートするかな。
08/09の00:40くらいからロビー第1サーバが落ちているらしい。とりあえず第0サーバが使えているので影響は少ない方。
停電の影響ないかなー,って軽く見に行ったんだけど,全然関係なく落ちてるとは。
今やっている仕事でCreateProcessを使ったので,以前日記に載せたのを見ていたのだが,第3引数のsaはいらない。これから作成するプロセスのハンドル属性なので,プロセスのハンドルを子に継承させるならいるけど,この目的では不要。ネットで検索するといくつか参照されているようなので直しておいた。
学生時代に書いたコードは動けばいいや,てな感じだったので,今読み直してみると怪しげなコードが多い。つまりさくら(略)なわけだ。仕事でやってると1つのAPIでも完全に調べてエラー処理も全てやるって感じなので,めんどくさいけど実はこのくらいやるべきだったよね,とか思う。
パジ氏がFlashで缶コーヒーの無重力アニメーションをやっていたので対抗してWorld Testerで缶コーヒーの無重力アニメーションをやってみた。ユーザが簡単にカスタマイズできるようになれば結構面白いソフトだと思うのだが,今のままだとやっぱり使いづらいですね。
4号がノートとデスクトップをLANで直結していたので,どこからクロスケーブル持ってきたの? って聞いたみたのだが,普通のケーブルだよ,と言われた。ハブで自動判定というのはよく聞くが,最近はNICでも自動判定なんですね。
デバッガの話。VC2005ではリモートデバッグをサービスで起動できるので,ログイン前に起動するプロセスもリモートデバッグできる。成功したことないけど。で,同じ事をVC2003でやりたくて悩やんでいたのだが,タスクで起動すれば? との助言に従ってみると,見事に成功した。便利。