2007年9月アーカイブ
綺麗に色分けされたソースコードをブログに載せている人がいて、どんなソフトを使っているのか参考にしようと調べてみたら、はてなダイアリーに標準で備わっている機能(superpre)でガックリ。
うちで使っているMovableTypeで同じことができないかと調べてみたら、VimColorプラグインがありました。当サイトでも既に導入済みで、半歩進んだエラー処理のソースコードはこれでハイライトされています。
ところで、このプラグインはキーワードのハイライトだけでなくTabもスペースに展開してくれて便利なのですが、なぜか行頭のTabだけスペースが2つ少なくなります。Tab4だとスペース2つ、Tab8だと6つになってしまいます。行頭に何か文字(例えばC++のコメントの//)があるとこの問題は発生せずに、設定通りのタブストップ位置までスペースが挿入されます。このせいで、コメント行とそうでない行で2文字タブ位置がずれてしまう問題も発生しています。
このプラグインは最終的にテキストエディタのVimを起動してそちらに処理を委ねているので、Vimのオプションを見ながら関係がありそうなものを片っ端から試してみましたが、まったく改善されませんでした。プラグインのソースコードを見ても何も悪さはしてなさそうなので、どこに原因があるのかさっぱり分かりません。
今はエディタでTabをスペースに変換してから貼り付けるという方法で回避していますが、手間が増えてめんどくさいです。なんとかしてプラグインにTab変換をやらせたいのですが、そもそもVimなんて使ったことのない私には何をいじったらいいのやら...
当サイトは無料のウェブスペースを利用しているので、一番上に自動でGoogle AdSenseの広告が入ります。
Google AdSenseは広告が掲載されるサイトの内容に基づいて一番適合しそうな広告を自動で選んでくれるサービスで、広告主もそれを掲載する側も何も考える必要はなく、費用(労力)対効果としては素晴らしい広告ではないかと思います。特に無料ウェブスペースのようなサービスでは、これ以外の広告は考えられないほどの効果があると思います。
広告といえばニコニコ市場でおなじみのAmazonも有名ですが、そのAmazonにもGoogle AdSenseそっくりの広告があります。(まだβテスト中ですが)
とりあえず、うちのサイトにはどんな商品が選択されるのか、ためしに貼ってみます。(この記事だけ)
エラー処理って大事だけど面倒ですよね。初期化関数なんて真面目にエラー処理していたら、本来のコードよりもエラー処理の方が多くなったなんてのもよくある話です。
エラーコードやクラスを定義したりするのも面倒ですし、それらとエラーメッセージの対応を取るのも凄く面倒です。エラーが発生したかどうかだけが重要で、その内容はどうでもいい場合も多く、関数の戻り値をTRUE/FALSEやS_OK/E_FAILのように2値にしている方も多いと思います。
しかし、成功か失敗かの2値だけではほとんどデバッグの役に立ちませんし、各所でエラーメッセージを出そうとすると汚いコードになりがちです。いちいちエラーメッセージを出すのが面倒になって、全てのエラーを「初期化エラー」の一言で片付けていませんか?
そこで、半歩進んだエラー処理として、例外処理を使ったとても簡単な方法を紹介します。
USB以前のゲームコントローラの接続に使われていたインターフェースは
- サウンドカードのゲームポート
- ISA/PCI接続の拡張カード(IF-SEGA2等)
- プリンタ用のパラレルポート等を利用したDirect Pad Pro
といったところです。
これらのインターフェースがUSB接続のものと決定的に違うのは、コントローラを接続しているコネクタの電気的な状態がCPUから直接見えることです。いまどんな信号が流れているのか、CPUからリアルタイムに見ることができます。また、コントローラの状態の読み出しが、アプリケーションの実行パスの一部として直列に処理されます。
それに対して、USBは通信にかなり複雑な手順が必要なため、ゲームコントローラや変換機にもCPUを搭載していて、実際にゲームコントローラの状態を読み取るのは、そちらのCPUが行っています。
前回、ポーリングの間隔が十分に短くないと入力の取りこぼしが発生するという話をしましたが、USB接続の場合はコントローラや変換機側のCPUが適当な間隔でポーリングをして、USBを通して情報をPCに送っています。このコントローラ(変換機)側のCPUのポーリング間隔がレスポンスに影響してきます。
では、このポーリング間隔が、どの程度ならレスポンスに問題が無いのでしょうか?
よくある誤解が、連打速度を基準にすることです。高橋名人が16連射だから、1秒間に32回ポーリングすれば十分だろうという発想です。 *1
確かにボタンを連打するという操作では1秒間に16回程度が常人の限界だと思いますが、レバー操作やボタンのずらし押し等は、それより遥かに速いテンポで入力されています。
ハイパーオリンピックという主にボタンを連打することで記録を競うゲームがありましたが、この種のゲームで記録を伸ばすために、レバーにボタンを配線するという方法が使われました。 *2 各所のハイスコア集計で自動連射機能は禁止されていましたが、このレバーを使用した方法はセーフである場合が多く、通常のボタン操作よりも遥かに高いスコアをたたき出していました。 *3
この例でも分かるように、レバー操作はボタン連打よりも速いスピードで入力が変化しており、連打速度を基準では不十分です。
また、ゲームが60fpsで動いているのにコントローラが秒間20回しか情報を更新していなければ、全ての操作が3フレーム単位となり、3フレームより短い入力は不可能です。正確に1フレームだけボタンを押さないといけないアキラの膝なんて絶対に出ません。タイミングを合わせるような操作も、3フレーム単位でしか調節できなくなります。これではブロッキングとか無理ですね。
なお、このレスポンス問題をラグ(遅延)と誤解している人が多いですが、遅延とは違います。50ms間隔でポーリングしている場合、ボタンを押してから実際にその情報が読み取られるまで最悪で50msの時間がかかるので、これが遅延だと思われています。
ほとんどのゲームが60fpsで動いているので、入力も60回行えるのが理想ですね。ただ、1秒間にきっちり60回ポーリングすると、ゲーム側が60.1fpsのように微妙に速かった場合に、たまに1回の入力が2フレームまたいでしまうことになるので、もう少し余裕を持たせた方がいいと思います。
サンワサプライのPlaystation用コントローラ変換機のJY-PSUAD11やその旧製品のJY-PSUAD1は、1秒間に110回もポーリングしているので、現時点ではこれが一番良いでしょう。 *4 この手の製品でコントローラを2つ接続可能なものは、1つのものと比べてポーリング間隔が半分になっているのがほとんどなので、レスポンスを気にするなら2つ接続できるものは避けた方がいいです。
ゲームコントローラがUSBで接続されるようになってから、レスポンスというのが大きな問題になるようになりました。なぜこのような問題が発生するかというと、それは「ろくにゲームもしない人がコントローラを作っているから」です。
という話は置いておいて、技術的な面からこの問題について説明します。
キーボードやマウス、ゲームコントローラのような入力機器の状態をホストであるPCに伝える手段に、「割り込み」と「ポーリング」という2種類の方法があります。
割り込みは、デバイスが自分から能動的にデータを送り込む方式で、CPUはデバイスの状態を監視する必要はありません。CPUが他の仕事をしているときでも、デバイス側から呼びかけてCPUに今やっている仕事をいったん中断させてから情報を渡します。割り込みが発生するたびにCPUは仕事を中断させないといけないので、あまり頻繁に割り込みをかけると全体の処理速度に影響が出てきます。 *1 この方式は、非周期的で入力の頻度が少ない機器に向いています。また、入力の取りこぼしが発生しないという利点もあります。PCではキーボードとマウスがこの方式を使っています。
一方ポーリングは、CPU側からデバイスに現在の状態を問い合わせることで情報を伝えます。デバイス側から自発的に情報を送ることはせず、聞かれるまで黙っています。この方式では、CPUから問い合わせがあったときに最新の状態を伝えるだけで、前回の問い合わせから今回までの間に起こった変化については関知しません。そのため、ポーリングの間隔が十分に短くないと、入力の取りこぼしがおきてしまいます。また、入力を受け付けている間は周期的に問い合わせる必要があるため、CPUはゆっくり休むことはできません。一般的にゲームコントローラはこちらの方式を使っています。
両者のもう1つの特徴は、割り込みデバイスは基本的に入力の「変化」を情報として伝え、ポーリングデバイスは現在のありのままの「状態」を伝えます。例えばキーボードでは、あるキーが押されたらそのキーがONになったという信号を送りますが、そのキーが押され続けている間は何も送りません。次にキーが離された時点で、OFFになったという信号を送ります。 *2 このとき、キーOFFの信号が何らかの原因でロストしてしまうと、キーを離しても押しっぱなしの状態になってしまいます。Windows上でキーボードやマウスのボタンが押しっぱなしの状態になってしまった経験がある方も多いと思います。逆にポーリングデバイスでは、このような押しっぱなし現象は発生しません。
長くなったので、続きはゲームコントローラのレスポンス問題 その2で。
GeForce7600GSの画面のプロパティの一部ですが、初期設定では最大で3フレームの先読みレンダリングをするようになっています。
これは、アプリケーションに対しては描画が完了したように見せかけて、実際には最大で3フレーム分の描画処理を溜め込むという設定です。
これが無いとGPUがCPUから命令されるまで暇を持て余したり、GPUが前の仕事を終わらせるまでCPUが待たされたりして、スムーズに仕事が進みません。そこで、3日先の仕事の内容まで先に聞いておいて、指示待ちをすることなく黙々と仕事をこなすことで効率をあげようというのが、この機能です。
CPUが既に終わっていると思っている仕事が、3日分も溜め込まれているので当然ですが遅延が発生します。
この機能はSLIで特に効果を発揮し、3フレーム遅延してもfpsが3倍になれば変わらないはずというのが、NVIDIAの言い分です。
しかし、それにはアプリケーション側が可変フレームレートで動作するものでなければいけませんし、VSYNC同期も切らないといけません。
VSYNC同期をオンにしたまま60fps以上で動作するゲームを遊ぶと、GPUが描画命令を消化するスピードが1秒間に60回ずつに固定されてしまうので、いつまで経っても3フレーム(0.05秒)の遅延が解消されません。
私は最近はそれほど重いゲームは遊ばないので、多少の効率ダウンには目をつぶって、遅延重視でこの値を0にしています。
ちなみに、この項目は初期状態では見えないように隠されています。どうやって出すのかは覚えてないので省略。
以前からゲーマーの間では、液晶モニタは映像信号の入力から実際に画面に出力されるまでに遅延があることは知られていましたが、今年になってから各テレビメーカーが遅延低減を謳ったゲームモードを売りにしてきたこともあり、やっとテレビメーカーも遅延があったことを公表しました。
テレビ放送のような非インタラクティブなコンテンツでは遅延は全く問題になりませんが、テレビゲームのようにプレイヤーの操作と画面が連動して動くインタラクティブなコンテンツでは、遅延が問題になってきます。(過去の映像を見ながら操作するのでその分反応が遅れる)
遅延は映像をより美しく見せるための高画質化のための画像処理が原因となっており、安物の低機能なモニタよりも高画質な高級機の方が遅延が多いという悲しい傾向にあります。
安物のモニタであっても、液晶モニタは液晶パネルの解像度がきっちり決まっているので、それと異なる解像度の信号が入力されたときは、スケーリングという一種の画像処理が必要になります。 *1
これらの画像処理をする際には、一度フレームバッファに1画面分の映像を溜め込む必要があります。1画面分キャプチャしてから、パネルに合わせてスケーリングし、それが終わってからやっとパネルに出力されます。 *2
1画面分キャプチャするためには、映像信号が画面の左上から始まり1行ずつ出力されて右下まで走査し終わるまでの時間が必要です。ブラウン管ではこの時点で既に画面の表示が完了していますが、液晶モニタではここでやっとスタート地点に立った状態です。この走査の時間は、1フレーム分に匹敵するほどの時間がかかるので、この時点で既に液晶モニタは1フレーム分遅れています。
テレビメーカーが1フレームしか遅延しないと発表している遅延低減モードが、ユーザの実測では2フレーム遅延していたという話もありますが、この走査終了を0秒とメーカーは考えているために、そのような食い違いが起こるのではないでしょうか。
なお、私はテレビの専門化ではないので、この記事は全て憶測で書いています。
※追記(2007/10/17)
YouTubeに遅延が分かりやすい動画がありました。
長年、地味にお世話になっていたinfoseekティッカー(Web設置型のコンパクトなニュース配信ティッカー)が2007年7月17日をもってサービス終了となってしまいました。
基本的にプル型のメディアのインターネットでは、自分の興味の無い分野の話題は最初から目に入ることもなく、それゆえに情報に偏りが出来てしまいます。そんな状況を少しでも改善するために、私はニュースティッカーのようなプッシュ型サービスを利用しています。
また、ティッカーを配置することを前提にレイアウトを決めていたので、ティッカーが無くなるとレイアウトも考え直す必要があり、それも面倒なので別のティッカーを探すことにしました。
そこで見つけたのがai-Tickerです。これは自分の好きなRSSを表示させることができ、またデザインも自由に変えることができます。(自分のサーバに画像を用意すれば自作スキンも使えます)
ai-TickerにYahoo!ニュース等が提供するRSSを表示させれば、自分の好きなニュースを配信させることができます。(当サイトのティッカーは掲示板に設置してあります)
ところで、せっかく好きなRSSを表示させることができるのだから、もっと面白い使い方を考えてみます。
Movable Type 4がリリースされていたので、3から更新してみました。
テンプレートの構成が変わって色々エラーでまくりだったので、おもいきってデータベース初期化、新規インストールをしてから、過去の記事をインポートしました。
前から欲しかった、ブログ記事以外のウェブページの作成ができるようになったのが嬉しいです。
また、テンプレートを初期化したおかげで、3.3くらいから追加されていたらしいFlickrのようなタグ付け機能も使えるようになりました。(YouTube, ニコニコ動画の方が最近は伝わりやすい?)
かなり便利になっていますが、システムだけで18MBの容量を食ってしまうので、50MBしか使えないXREAの無料アカウントではちょっと厳しいですね。

