スプライト (映像技術)
スプライト(Sprite)は、主にビデオゲームで用いる、画面上の小さなキャラクタを高速に合成表示するための技術的な仕組みである。
この機能は、通常の画面表示における映像の情報を記憶しているビデオRAMとは別に、多数の小さな画像を画面上の1ピクセル単位で任意の位置にハードウェアで合成して表示するものである。
背景となる画像やテキスト、複数のスプライトで任意の優先順位で重ね合わせて合成表示ができるようになっており、低価格帯の機種などでは単色であったりと、描画表現よりも動くパーツを表現するのに適した機能である。
これはアニメーションにおけるセル画の概念に近く、セル画に例えるなら背景の上にキャラクタの大きさに切ったセルを置いて、1コマ毎にキャラクタのセルを背景上で移動させながら動かしたり、別のセルに置き換えたりしていくというものである。
例えばゲーム上において主人公=プレーヤーがソリに乗るシーンを表現する場合、スプライトを使った映像表現では、座っている主人公が描かれたスプライトの下にソリのスプライトを重ね、ソリが動き出した際にソリや主人公を細かく上下・または左右に小さく動かす事で、主人公の乗ったソリが勢い良く疾走してガタガタと地面の凹凸によって振動する様子が表現できる。
主人公がソリからボートに乗り換える場合には、座っている主人公のスプライトの下にボートのスプライトを置くだけで済む。このように実際に表示されるデータそのものを書き換えるよりも遥かに軽い処理であり、表示そのものよりも動きという点において優れた表現力を発揮する。反面、特にラインバッファ方式の実装ではメモリの速度に横方向の同時表示の数は依存するため、そのキャラクタの大きさや数は、ハードウェアの設計に制限を受ける。スプライト機能が単色のハードウェアで複数色のキャラクターを表現する場合は、色別のキャラクタを複数重ね合わせることで対処する。
プログラム上においては、キャラクタを移動させるときは各スプライトの表示位置情報だけを変更すればよい。よってソフトウェアで画像の重ね合わせ処理などを行う必要がなく、CPUにかかる負荷、VRAMのバスに対する負荷、ソフトウェア開発(主にプログラマー)への負担が少なく、プログラムの品質も安定する。優先順位の指定により、奥行きも簡単に表現できる。これは前述の応用表現のように、特に幾つかの部品を別々または一緒に動かす事で動きとしての表現能力を向上させると共に、パーツ単位での合成が容易となり、総データ量の削減に寄与し、制作負荷の低減や少ない記憶容量の媒体でより表現力の豊かなゲームを提供できる事にも繋がった。
初期にはアーケードゲームにて専用の電子回路を組んで実現されていた。次第に汎用化され、ファミコンなどのゲーム機、パソコンの一部(MSX、X68000、FM TOWNS)などで利用できるようになった。
その特性から、画面上で多数のキャラクタが同時に動く、シューティングゲームやレーシングゲームで重宝された。スプライト機能を搭載したハードウェアの場合、少ないCPUリソースでキャラクターを画面上で多数スムーズに動かせるため、CPU処理能力の低い時代におけるコンピュータでは滑らかな動きと速度を要求するゲームでその力を発揮した。スプライト機能を持たないハードウェアではCPU処理速度、VRAMの構造などから実現が難しいことであった。
ファミリーコンピュータ・MSX・X68000などで使われる。
モニターに出力する映像信号を生成する直前に、VRAMから読み出した、ビットマップあるいはキャラクタベースのグラフィック面のデータと、スプライトICより送られて来るスプライトのデータを、走査線1ライン分の容量のラインバッファ上で、合成処理する。
この方式のメリットは、グラフィックバスを殆ど消費せず、またキャラクタの合成処理に必要なワークRAMが少なくて済む、という点である。
しかし画面の走査と並行してスプライトを合成するために、そのスプライト用のバッファには高速なメモリを必要とし、横方向へ多数表示した場合、合成処理が追いつかず、間に合わなかったものは表示されないという状況になる。この際、通常は内部のインデックスが遅い(優先順位が低い)スプライトから表示が欠けていき、スプライトの数が増えれば増えるほど、1ライン内での合成処理のタイミングがシビアになる。この仕様を逆手に取り、合成処理の一部として使用しているソフトウェアも存在する。
これらの制限に対しては、特に最大表示個数に制約が多い家庭用ゲーム機など、多くのソフト上では、表示するスプライトを選別してちらつかせながら表示することで、スプライト欠けを緩和していた。また、水平帰線期間内に制御可能なハードウェアでは、走査線判定、割り込みなどを使用して、実表示が終わったエリアのスプライトの位置情報をまだ走査されていない領域で利用することにより、仕様上の最大表示数を越えた画面表示を行なう「スプライトダブラー」などの処理も開発された。(ラスタースクロールも参照)。
FM TOWNSや業務用ゲーム機などで使われていた方式である。
日本の家庭用のコンピュータでは、FM TOWNSで初めて採用された。発売当時の家庭用のコンピュータで一般的なスプライト機能の実装方式と異なるため、俗に「擬似スプライト」と呼ばれることがあった。3DOやセガサターンなどの第五世代以降、ゲーム機でも主流となっている。
原理は単純で、スプライトのみ描画するフレームバッファを2画面分確保する。そして1フレーム分のスプライトをオフスクリーンのフレームバッファに全て描画する。描画完了後に現在オフスクリーンのフレームバッファと、オンスクリーンのフレームバッファを切り替える。スプライトの描画が完了したフレームバッファは単なるビットマップグラフィックプレーンとして他のグラフィックプレーンと合成して出力される。これを繰り返す。
メリットはラインバッファ方式と異なり、横方向にスプライトを並べられる数に制限がない。スプライトICによるVRAMへの描画速度とVRAMの速度が向上すれば、リニアにスプライトの表示上限を向上させることが出来る。このためフレームバッファ式のスプライトは、ラインバッファ式を遥かに上回る最大表示個数を実現していることが多い。また基本的には、CPUが行うかスプライトICが行うかの違いを除けば、VRAMへビットマップデータを描きこむという点では同じであるため、スプライトに対する拡大縮小などの特殊効果の実装に無理がない。
デメリットはVRAMが大量に必要であり、またVRAMへのスプライトデータ(つまりビットマップデータ)の高速な描画能力も必要である。また1フレーム中に表示可能な枚数を越えて表示させようとすると表示バッファを切り換えるタイミングが2フレーム以降になり、この遅れによる表示のもたつきが発生する。なおフレームバッファ方式でも初期の実装(セガのシステム基板など)の場合は、垂直帰線期間に全てスプライトの転送が終わることを前提として1フレーム分しかバッファを設けず、スプライトレイヤの描画タイミングがなんらかの理由で遅延した場合は、優先順位が低いスプライトが丸ごと大量に消えたりする。
プログラミング技法そのものが、広告のキャッチコピーとして多用された時代は、上記ハードウェアスプライトに対して、ソフトウェアによる重ね合わせ、キャラクタ表示の高速処理をソフトウェアスプライトあるいは擬似スプライトと表現していた。必ずしもハードウェアスプライトの持つ特徴、優位性を包含するものではない。その後、Windows等のハードウェアスプライトを持たない環境でもDirectDraw等のAPIを介して、同様の処理はフレームバッファに描画される形で擬似的に実現されている。
パソコンにおいてはハードウェアスプライトこそ淘汰されたものの、ソフトウェアによるものは依然としてポピュラーな技法である。背景とキャラクターの分離によるデータの削減が可能なため、ノベルゲームのような動きの少ないケースでも重要である。インターネットでもAjaxの普及とカスケーディングスタイルシートの強化などにより、従来はアニメーションGIFやAdobe Flashで実現されていたウェブサイトの動的なアクセントなどに活用されている。
上記のような描画の仕組みを持たないPlayStation (ゲーム機)等でも、GPUの持つテクスチャマッピングの機能を応用し、正面を向いた四角形のポリゴン(ビルボード)をハード的、あるいは SDK などのライブラリでラッピングするなどして同様の処理を実現している。Windows用アプリケーションであっても同様に、GPUの機能による合成、エフェクトなどを使用したスプライトに近似する実装も行われている。