サターンの3D性能
目次
SH2 の演算速度
サターンは、CPU に SH2 を採用していました。
日立の SH1 を、セガの要望でカスタマイズしたもの…と、セガはインタビューなどで答えていましたが、日立側の見解は多少違うようです。
まぁ、それはまた別の回で書くことにして、SH2 の計算能力について、ちょっとお話ししましょう。
以下、技術に詳しくない人には退屈な話かもしれませんが、次の話に移る前に必要なので細かな数字を多用します。斜め読みで構いませんので、もう少しお付き合いください。
3Dの表現では、2D以上に計算が多用されます。プレステでは3D専用の計算回路を持っていましたが、セガサターンは「究極の2Dゲーム機」を目指していたため、3D専用の回路など持っていません。3Dに必要な計算は、すべて CPU で行うことになります。
SH2 は RISC CPU です。RISC が何かは省きますが、簡単な命令しか持たない代わりに、高速に動作する CPU だと思ってください。SH2 は簡単な命令しか持たない。これが重要です。
ところが、SH2 には1つだけ、複雑な命令があるのです。それが「掛け算命令」でした。
SH2 は、基本的にすべての命令を1クロック(CPU が動作する最小の時間)で実行します。しかし、掛け算だけは1クロックでは実行できません。通常3クロック、状況によって2~4クロックと速度の変わる命令でした。
他の命令はすべて1クロックで実行されますから、3クロックと言うのは「遅い」のですが、実は SH2 は他の CPU よりも優秀でした。プレステの R3000 では、掛け算命令は 12クロックなのです。実は、3クロックと言うのは、当時としては「非常に高速」な部類でした。
しかも、掛け算命令は同じ3クロックの中で、掛け算をしながら足し合わせる「積和演算」という機能も使えました。後述しますが、3D の計算には欠かせない、行列の掛け算で威力を発揮する命令です。ただし、多少癖があるので使うのには他の命令との組み合わせが必要です。
…この「掛け算」が最大に複雑な命令であることに注意してください。掛け算以上に複雑な命令である、「割り算」は持っていません。
割り算は複雑すぎるため、「1ステップ除算」という命令になっています。これは、割り算の筆算1段分だけを計算する機能。繰り返し使うことで割り算を計算できます。
最初に「除算設定」命令で、割る数と割られる数を設定します。これは1クロック。次に、「1ステップ除算」を実行すると、「1桁分」の結果が得られます。
16bit の場合、2進数で16桁を計算する必要がありますから、1ステップ除算を16回繰り返すと結果が得られます。つまり、最初の設定を入れて 17クロック。これが割り算の速度で、非常に遅い計算です。
32bit演算の場合、32クロック…と単純にはいかず、64クロック必要です。
後ほど書きますが、3D演算での割り算は「画面上の表示位置」を求めるために必要で、画面のドット数は最大で 704ドット。
最終的に 704ドットを求める計算であれば、除算は 16bit の精度で十分です。
実際のゲーム中では精度を重視して 32bit 演算している可能性もありますが、以降は割り算を 16bit 精度で行っているとして話を進めます。
サターンの SH2 は 28.64MHz のクロックで動作します。1クロックで1命令だとすると、1秒間に 2864万命令を実行できる、ということです。
でも、先に書いたように、掛け算は 3クロック、割り算は 17クロックが必要です。
ところで、3D のポリゴンを「好きな位置」に表示するには、3D 演算を行う必要があります。このために「回転・移動行列」(以下、回転行列と記述)を使用します。これは、3x4 の行列です。
ポリゴンの移動とは、1つの頂点 (x,y,z) ごとに、3x4 の回転行列を掛け合わせることに相当します。
行列は、高校生で習う数学に出てきます。義務教育ではないので知らない方のために説明すれば、「いくつかの数値を組み合わせて、いっぺんに計算を書く方法」です。
いっぺんに書いてあるだけで、計算がいっぺんにできるわけではありません。実際の計算自体は、掛け算と足し算をひたすら繰り返すだけの、面倒くさいけど難しくはないものです。
先に書いた積和演算機能を使えば、この行列計算を素早くこなせます。1x3 の頂点座標を意味する行列と、 3x4 の回転行列の掛け算だと、12回の掛け算と9回の足し算を行うことになりますが…
CPU の命令の癖などに話がおよぶので、詳細は割愛。えーと、多分この計算は、最低でも 68クロックほどかかります。
最後に「透視変換」と言う処理が必要です。3D の中で回転・移動された頂点データを、画面の2D座標に変換する処理です。
この式は簡単で、X , Y の2点を、それぞれ Z で割るだけ。…処理は簡単ですが、遅い割り算を2回も使う必要があります。
透視変換も計算してみると、50 クロックほどかかります。
合計で 118クロック。これが3Dデータを好きな位置に持っていって表示する、「ジオメトリ演算」に必要な処理速度です。
実際には、回転行列を用意したり、ループする命令があったりと、周辺の処理もたくさんありますので、必要時間は 150クロックくらいと見積もってみましょう。
秒間 2864万クロックを、150クロックで割ると、およそ19万回です。
頂点数の数だけポリゴンが表示されるとして、19万ポリゴンが SH2 で計算できる最大のポリゴン数となります。
ただ、これは理論上の値です。実際には2割引きで15万ポリゴン、と言うところではないでしょうか。