反論紹介
目次
メモリ
メインメモリもサターンは下位が16bitなので、PSのメインメモリ2MBに対して、SSはメイン1MB+補助メモリ1MBというのが正しいと思う。1MBのリソースの半分程度をライブラリが占拠するから、感覚的にはPSの5分の1のメモリだった。
— kozo (@yukizokin) November 11, 2013
こちらも執筆時には忘れていました。指摘されて思い出しました。
サターンが採用していた SDRAM は、高速なのですが当時まだ高価でした。ちなみに、プレステは通常の DRAM。
まず、プレステはメインラムに 2Mバイト、VRAM に 1Mバイトを搭載していました。
サターンは、メインメモリが 2M バイト、VRAM が 1.5M バイトでした。しかし、これを全部 SDRAM で用意すると値段が高くなりすぎるため、メインメモリの半分、 1M バイトは DRAM になっていました。
ここで問題が起こります。プログラムとよく使うデータは、SDRAM に置いておかないと、実行速度があからさまに低下するのです。
なんでそんな変な構成に? …というのは、推察は出来るけど不明です。
つまり、プログラマにとってはメインメモリが「プレステの半分」と言っても良い状況だった、ということ。
ここに巨大なSGLライブラリが入るので…という話ですが、今調べてみたら、SGLが使用するのは 272Kbyte でした。メモリサイズの4分の1強。半分とまでは行きません。
一応サターン側の肩を持っておけば、プレステの CPU R3000 は1命令が 32bit ですが、サターンの SH2 は 16bit です。なので、プログラム「だけ」なら、メモリは半分程度で大丈夫です。
でも、この頃のゲームって、すでにプログラムよりもデータの方が大きいんですよね…。そして、データは R3000 だろうが SH2 だろうが同じサイズです。
事実がどうかではなくて、「感覚的に」と断ったうえで5分の1という窮屈感を感じるのは、非常に良くわかります。
個人的な話になりますが、プログラムを組んでいた当時、自分で「メモリマップ表」を作り、コピーして鉛筆で書きこんでいました。
プログラム修正などで細かくメモリ配置が換わったら、消しゴムで消して修正します。
大きく変わったら、新しい紙に書きなおしていました。
VDP1 RAM と VDP2 RAM と、メインメモリと…全部で4つあったはずだけど、あと何書いてたっけ?
と思っていたのですが、kozo さんの指摘で思い出しました。メインメモリを2つに分けていたのだった。
プログラムとよく使うデータを高速メモリに、あまり使わないデータを低速メモリに置くようにしていた覚えがあります。
ただ、僕がプログラムしていた ST-V の場合、CD-ROM よりも高速な ROM にデータを置けるので、すべてのデータをメモリに載せておく必要もありませんでした。
低速メモリは出来るだけ使わずに置いといて、サターンに移植する必要が出た時のバッファとする…というのが暗黙の了解だったように思います。
これも、低速メモリの存在を忘れていた理由かな。
サターンはプレステよりメモリがトータルで多かったけど、テクスチャが16bitだったこともありテクスチャが粗くならざるを得なかった。強力な回転BGを背景に使えるけど、こっちは余裕がありすぎてやたら解像度が高く出来る。手前が粗くて奥が細かい絵作りは、余計テクスチャを粗く感じさせた。
— kozo (@yukizokin) November 11, 2013
これは…先に書いたように、僕自身グーローを使ったゲームに関与しなかったので実感がないです。
フラットな 4bit テクスチャ(16bit よりメモリを食わないので、細かく書き込める)でも、回転BGと組み合わせた時に、テクスチャが荒く見えましたけどね (^^;;
…って、結局テクスチャは荒かったって話か。
以下、プレステのグーローがらみの話をしてくださっていますが、僕が経験していないのであまり補足はできないです。
プレステは頑張るとそれに答えてくれる感じ。8bitテクスチャで工夫すれば16bitの倍の容量と1.5倍程度の描画速度が得られる。4bitテクスチャだと更に倍。場所によって使い分けも当然出来る。反面サターンは16bitか、シェーディング無しの4bitの選択をいきなりの2択。
— kozo (@yukizokin) November 11, 2013
頑張ってシェーディングモードを選んでも、プレステは行列演算用にGTEを平行光源3本+アンビエント光をまとめて行列として計算する方法よりはるかに遅い。サターンはパレットを使って裏側からも光が当たっている、というモデルにおいて2光源使えるテクニックがあったがかなり苦しい。
— kozo (@yukizokin) November 11, 2013
ここら辺は、先に説明したテクニックのことです。
技術的には同じことを書いていても、当時の使用感を伝えるものとして引用しておきます。
SGL
ここからはSGLライブラリの話。
サターンはライブラリの問題も足を引っ張っていた。30fps(2int)で開発していてピークを超えるとハングアップする。(この現象は後から発売された欧州版のサターンだと出ない。直されたのだと思う)、そのため、ギリギリの処理を詰め込むことが出来ない。(続)
— kozo (@yukizokin) November 11, 2013
(続)ライブラリはバグがやたら多い。BGに連続パターンが定義できないとか、サウンドが鳴らない事があるとか、ムービーが再生できないとか、いくつかはバグフィクスされていったが、リリースされる度にポリゴン描画能力が落ちていった。これが処理オチでのハングアップ不具合と相性が最悪。
— kozo (@yukizokin) November 11, 2013
バグの多さには僕も泣かされたので共感します。僕はサウンドバグで泣いたなぁ。
業務用の ST-V で作っていたので、3日くらい電源入れっぱなしでも動作がおかしくならないこと、というチェックがありました。
ところが、丸一日動かしておくと、サウンドが止まってしまうのです。
最終的に、その時使っていたサウンドドライバのバグだと言うことになり、古いバージョンをもらって(そのせいで一部機能が使えなくなって)解決した覚えがあります。
…と、僕の経験談はともかくとして、「ハングアップ」と言うのは大バグです。
kozo さんに後で詳細を聞いたところ、2int で動作させていなければ出ないうえ、PAL 版では出なかったので、ハードのバグではないか、とのこと。95年末ごろまでは、このバグがあった覚えがあるそうです。
…先に書いた、僕が関わったゲーム、調べてみたら 2int で、95年末以前に作っていました。でも、そのバグに遭遇したことは無い。
ハードの問題ならば、ST-V では微妙な差異によってハングアップしなかったのでしょうね。
提供されるオーサリングツールもプレステとサターンで大きな差があった。サターン(SGL)ので特に酷いセンスは頂点やテクスチャデータをCのソースでデータを出力すること。全部メモリにおけるわけが無い。バイナリ化しても構造体のアドレスもフォーマットとして打ち込まれていた。
— kozo (@yukizokin) November 11, 2013
だから読み込んでから再配置処理が必要になる。そこは回避がまだ可能だからいい。問題はたとえばテクスチャデータだとテクスチャのサイズがデータ化されていないこと。変数名としてサイズが書かれている。だから手作業でサイズデータを一枚一枚打ち込まないといけない。自動化できない。零細にはキツイ
— kozo (@yukizokin) November 11, 2013
提供されるツールが貧弱である、というのは、プレステはサードパーティ獲得に熱心だったが、当初のセガにその考えがなかった、ということとも関係しているように思います。
ゲームを作りなれている会社だけを相手にするつもりなら、多少貧弱でも最低の物が揃っていればいいです。
でも、ソニーがサードパーティの「数」を問題にし始めたので、セガもあわてて数を獲得しようとして、ゲームを作りなれていない会社もサードパーティに加えます。
しかし、泥縄対応だったので十分なサポートはできていませんでした。もちろん、ソニーは当初通りの計画なのでサポートは手厚く行っていました。
セガサターンが現役だった時代、手厚いサポートを提供するための部署、というのは結局作られなかったのではないかな。そして多分、ドリームキャストの時にも。
ハードウェアが複雑で開発しにくかった、とよく言われているのですが、むしろ「サポートが貧弱で」開発しづらかったのではないかとも思います。
そして、生成されるのは確かにCのデータでしたね。
ついでに言えば、テクスチャデータはたしか 8byte アライメント(先頭が、8byte 単位の区切りに来ないといけない)という制限があったにもかかわらず、その形式でないデータを作ってくれました。
横は8ドット単位、縦は1ドット単位なので、1ドット4bitのデータを作ると 4byte 単位の「端数」がでる場合があるんですよ。
この端数を処理するパディングデータ(アライメントを合わせるためだけに存在する、無意味なデータ)を入れてほしいのだけど、入れてくれないので正しく表示できない。
そんな変なサイズのテクスチャ描くほうが悪い、という気もしますが、実際困ったことがある。
Cソースでデータが作られるのは正直なところ問題で、僕は perl で処理してました。
この頃にかなり perl を使い込んで覚えたので、後に独立して WEB プログラマになった時に非常に助かった :-)
テクスチャとモデルのデータをディレクトリに入れたら、あとは自作ツールで
・テクスチャ・モデルデータをツールで処理
・得られたCソースを整形して、欲しい形式のデータの Cソースに
(後にパディング問題に気づき、この時点で処理するようにした)
・データをまとめ、アクセスしやすくするためのテーブルも同時に生成
・make を起動して C コンパイル
までこなしていました。
変更されていないデータも毎回処理するので遅かったけど、こまごま手作業しても同じくらい時間がかかるし、全自動の方がミスがなかったので。
…このプログラム、自作で誰にも見せなかったはずなのに、会社辞める直前になってみんなが使っているのに気付きました。
人に使わせようと思ってなかったから、バグが多数あったのも知っているのだけど、面倒だから黙って会社辞めました。