黎明 - システムタイマで1msも出せるなら十分だよね

 21 世紀初頭。初期の DTXMania では、タイマーとして、Windows が標準で提供するタイマー(システムタイマー)を使っていました。

時代はマルチメディア

 システムタイマーを使うAPIとしては、Windows 本体(kernel32.dll)に組み込まれている GetTickCount という関数と、のちにマルチメディア(死語)を強化するために Windows 本体とは別のライブラリ(winmm.dll)で提供された timeGetTime という 2 つの関数が存在していました。

 どちらも性能的には(内部で何らかのつながりがあるようで)同じくらいでしたが、DTXMania では timeGetTime のほうを使用していました。なにしろマルチメディア(死語)ですよマルチメディア!(死語)

 後から分かった話では、GetTickCount 関数は 16bit Windows への後方互換性のために存在していて、Windows 3.1 で Win32 API(というかマルチメディア開発(死語))をサポートし始めたあたりから timeGetTime 関数が主流になってきたそうです。

発声も入力も 1㎳ なら余裕だよね

 timeGetTime 関数の精度は、Windows 95/98で 1㎳、Windows NT/2000 で 5~10㎳ となかなか無視できない程度の違いがあったのですが、timeBeginPeriod という関数を使うことで、どの Windows でも希望する精度(最小1㎳)を設定することができました。

 この関数は必ずしも 1㎳ を設定できるわけではないという前提になっていましたが、気が付いたころには、ほぼみんな 1㎳ で決め打ち(プログラムにハードコーティング)するようになっていたようです。

 ついでに、timeBeginPeriod 関数はシステム全体に影響を及ぼすので、例えば sleep などの関数の精度(具体的にはプロセスやスレッドのスライスタイム)も、同時に 1㎳ まで上がることになりました。

 timeGetTime 関数を使うことで、サウンドや入力の精度を 1㎳ 単位で制御できる!
 10㎳ の壁なんて問題ない!

 音ゲーというものに対し、かなりの余裕をぶっこいていた時代でした。

描画はぜんぜん追い付かないよね

 今でこそグラフィックデバイス(以降、「GPU」と同義とする)は、軒並み、用途次第では CPU をはるかに凌駕する性能を提供しています。が、Windows 95/98 の時代には、GPU の性能が低くて CPU の足を引っ張り、ボトルネックになるということが多々あったように思います。Voodoo Rush とか VRAM 6MB とか言いながら実際は 2D で 4MB、3D で 2MB しか使えなかったとか何の呪いですか!

 そんな事情から、当時は、今ではおよそ見ることのできなくなった現象もいくつか見られていました。

 当時も今も、CPU は GPU に描画命令を送っていろんな画面を描画させるのですが、高速な CPU がどんどん GPU に命令を送るもんですから、すぐに GPU の処理が追い付かなくなります。

 CPU が限界まで命令を送っては GPU がそれを処理するのを待ち、GPU がそのスキにどかんと処理を行うので、結果として画面がうねり出します。実に滑らか、かつ不気味にうねります。

 そういう状態だともはやゲームどころではなくなりますので、すぐに気づいてプログラムを修正して加減を加えることができました。

 しかし、時代と共に、GPU の性能は凄まじい勢いで上がっていきます。すると、たとえ見た目は正常に見えたとしても、高い負荷で長時間動かし続けることで GPU が高温となり、最終的には熱でパソコンが暴走してしまうということも起きるようになりました。

 もちろん、GPU とのバランス次第では、 CPU 側の熱暴走もあったことでしょう。
 正直 区別がつきません。

余裕ぶっこいてたら 16.6㎳ に巻き込まれたよね

 画面がちらついたり画像がズレたり(ティアリング)することを避けるために、ゲームプログラミングでは、GPU の性能には関係なく、グラフィックデバイス(のつながっているディスプレイ)の垂直帰線期間を狙って描画を行う手法が一般的です。

 この垂直帰線期間は、一般的なリフレッシュレートである 60Hz の周期である約 16.6㎳ ごとに現れ、DTXMania もこのタイミングで画面を表示するようプログラミングされていました。

 しかし画面が滑らかになった代償として、サウンドと入力までもが描画の事情にあわせて約16.6㎳ 周期で回ることになりました。せっかく(理論上は) 1㎳ の精度が出せるタイマーを使える環境だったのに。

 当時の DTXMania では、VSync オプションを ON にするとこの状態になりました。VSync オプションを OFF にすると、最速で回るかわりに GPU を限界まで回してしまう…… わけでもありません。現在のグラフィックデバイスの能力は凄まじく、CPU でも GPU でもない別のハードウェア(マザーボードとかメモリとか)がボトルネックになって、これらの熱暴走を抑える結果になりました。

 当時のDTXMania の場合、VSync を OFF にすると描画をブロックするものがなくなり、それに連動してサウンドと入力の精度も上がりました。そのため、入力精度に不満があったり音ズレが気になるような場合には、まず VSync を OFF に設定してみることが定石として推奨されていました。もちろん、VSync を OFF にすると画面がちらいたり画像がズレたりする現象が発生するかも知れませんが、これは DTXMania におけるトレードオフだと考えられていました。(※DTXmatixx以降では別の新しい方式を採用したため、VSync オプションは存在していません。)

 このような精度低下を回避するために、GPU 側でもディスプレイ側でも、それぞれが様々な工夫を凝らしています。ここでは紹介しませんが、興味がありましたら「FreeSync」「G-SYNC」「Adaptive VSync」などをググってみてください。