統合タイムラインシーケンサAPIの可能性

(FIXME: メモ。後で動画入れる。)

現在制作しているteslawireは一種のリズムアクションなのでシーケンサを実装している。
これはchild of edenとかrezMIDIベースのゲームエンジンを採用していた( http://game.watch.impress.co.jp/docs/series/3dcg/20120302_515505.html )のをパクっていて、打撃ヒット等のイベントを"譜面"上に並べるためにかなりの仕様上の考察を行っている。

例えば、A) ターゲットに対して3発ロックオンしてそのまま発射した場合 と、 B) ターゲットに対して3発ロックオンし、ダッシュで接近の上近接ロックオンで攻撃した場合 ではロック数が同一でも(行動と)発声が全く異なる。実際には発生する風切り音等も全て楽音として発声されるため、より多くのノートが一度の攻撃動作で発生することになる。
child of edenやrezでは攻撃の仕様がここまで複雑ではなく、単純に事前に用意したシーケンスを"適切な拍に当てはめる"ことで攻撃パタンを網羅することができる。これはある意味リラックスしてプレイできるゲーム性を実現するための要請で、上級者のプレイほど(高スコアテクニックに対してプレイの巾が無く)同じプレイのくりかえしとなる傾向にある。teslawireはよりゲーム的な、つまり、より動的でランダム性のあるシーケンスの選択を要求し、どのようなレベルのプレイヤに対しても聞き覚えの無い楽曲出力を提供する。
これは意外な問題点: デバッグ困難性を生む。出力されるのが動的な楽曲であるため、同時発音数等のチューニングが困難で、良いバランス調整を行いづらい。人間が同じプレイをして同じ楽曲を得ることすら難しいため、問題の再現性が低く、悪い意味で一期一会の問題となる傾向がある*1

統合タイムラインAPI

現状のゲームルールに対して完全なリプレイ機能を開発するのは事実上不可能なので、タイムラインのためのAPIを作成し、全てのイベントを一つのタイムラインに乗せることを考える。
タイムラインAPIは:

  1. イベントの配置。一般的なMIDIシーケンサと同等のイベント配置機能を持たせる。
  2. 絶対時間によるクエリ。ある時間区分に含まれるイベントやアニメーションを取得する。一般的な時間だけでなく、bar/beatによる指定をサポートする。
  3. 楽曲表現への対応。Swing(小節内の拍のタイミングを調整する)やシンコペーション等。
  4. ビジュアライズとエディタ。

をサポートする必要が有る。基本的にはMIDIシーケンサを実現できるレベルの機能性と、以下の特殊な要求を達成できれば、ゲームの実現は可能と考えている。

  • クロックロールオーバのサポート

Win9xの49.7日問題( http://support.microsoft.com/kb/216641/ )やWinXPの497日問題( http://support.microsoft.com/kb/323328/ja )のようにタイムスタンプのオーバーフローを正しくハンドルできていないシステムはそれなりに多い。実際、ゲームでも長期間稼動させるとtickのオーバーフローにより、動作がガタガタになる等の問題を起こすものがある。
これを良くサポートするのは地味に難しい問題で、ゲームのように1セッションの時間が十分に短いと期待される場合は64bitタイムスタンプの利用を徹底することで事実上問題を無くすこともできる。

  • 複数のクロックソースのサポート

ゲームは同時に複数のクロックソースを使用する必要があり、どれか一つをマスタークロックとして適切なタイミングで歩度の違いを補正する必要もある。
ゲームで伝統的に使用されるクロックはVSYNC(60Hz)であるが、PC上で動作するゲームの場合は純粋なVSYNCは60Hzとは限らない。また、いわゆるアナログテレビの伝統により、HDMI経由の接続によるデジタルディスプレイであっても、実際には60Hzではなく59.97Hzとなる。
オーディオクロック(48kHz)に合わせるという考え方もある。特にオーディオは破綻の影響が大きい(音切れはコマ落ちよりも知覚されやすい)ため、熱心に扱う価値がある。タイムスタンプカウンタ(数百MHz〜)は、近年のP-state invariantなTSCでない限り、CPUクロック変更の影響を受けるという問題が有る。OSカーネルが提供するタイマ(100Hz程度)は、あまり精度が期待できない。
オーディオやビデオは良いタイマを提供するが、これらはHDMIケーブルを引き抜いた瞬間に消滅するという問題が有る。このため、robustなゲームを作るためにはこれらに頼ることはできない。しかし、単純にOSタイマのみに頼った設計では遅延を最小化することができない。

*1:これ自体ゲーム的にいかがなものかという感想が有るので、よりrezのような一定の楽曲を生成する方向に寄せるかもしれない。