解決策
1994年と1995年、Naughty DogのプログラマーAndy Gavinは、同スタジオ初の3DプラットフォームゲームであるCrash Bandicootを、ソニーの新しいPlayStation向けに制作した。このコンソールの高速システムRAMはわずか2MBで、CDドライブは低速ながら大容量であり、当時としてはレベルが大規模だった。Ars TechnicaのWar Storiesビデオインタビューで、Gavinはこの不釣り合いをどう克服したかを語った。
中心となった工夫は、高度な仮想メモリのスワッピング技術だった。各レベルは64KBのチャンクに分割され、Crashの目の前の画面上の環境に必要になったときだけ、CDから独立して読み込まれた。その結果、Gavinによれば、Tomb Raiderのような同時代のゲームの20〜30倍のディテールを実現したという。
次なる課題は、ワーナー・ブラザース風の表情豊かなアニメーションだった。CrashにはPlayStationが1フレームに描画する1,500ポリゴンのうち600が割り当てられたが、標準的なスケルタル3Dアニメーションはロボットのように見えた。そこでチームは、すべてのアニメーションにわたる500頂点分の位置アニメーションデータを事前に計算して保存し、あまり動かない頂点のデータを捨てる独自の圧縮アルゴリズムを書いた。Gavinの記憶によれば50〜80:1の圧縮だった。チームはまた、ほとんど検証されていなかったハードウェア上で利用可能なメモリと演算速度を最大化するため、PlayStation内蔵のコードライブラリをハックした。
達成したこと
RAMをキャッシュとして扱う。レベルを64KBのチャンクに分割し、画面上に表示されるときだけCDからストリーミングし、頂点アニメーションを独自の50〜80:1圧縮で事前に計算して保存する。
うまくいった理由
PlayStationのRAMはわずか2MBしかなく、レベル全体を収めることは到底できなかった。CDからのチャンク単位のストリーミングだけが、Rubinのアートが要求するディテールを実現する唯一の方法だった。
CDドライブは低速ながら大容量だったため、データを独立した64KBのスライスに整形すれば、スワップ装置として実用的だった。
当時のスケルタルアニメーションはロボットのように見えた。頂点ごとの位置を事前に計算して保存すれば、カートゥーン的なスクワッシュ・アンド・ストレッチが得られるが、データ量が膨大になり、独自の圧縮でしか収まらなかった。
ソニー内蔵のコードライブラリをハックすることで、誰も出荷したことのないハードウェア上で追加のメモリと演算速度を絞り出した。
応用できること
プラットフォームがあなたの世界を保持できないときは、可視のスライスだけを常駐させればよいようにデータを再構成する。低速ストレージからのチャンクストリーミングは、今やオープンワールドゲームで標準となっている。
その後
Crash Bandicootは1996年9月に発売され、Ars Technicaによれば、マリオやソニックに対抗するソニーのマスコット級の存在となった。同様の動的メモリ管理技術は今やオープンワールドのビデオゲームで標準となっており、同メディアはGavinのCrashでの仕事をその概念実証として評価している。
出典をたどる
出典
- War Stories: How Crash Bandicoot hacked the original PlayStation Ars Technica · arstechnica.com ·