SimCityは16MHzのCPUでどう街を動かしていたのか

How to run a city builder on 16 MHz

SimCityは16MHzのCPUでどう街を動かしていたのか

初代SimCityはIntel 386SX(16MHz)で動作していた。2008年にGPLで公開されたソースコード「Micropolis」を分析すると、鍵はSimulate()関数にあった。すべてのシステムを毎フレーム更新するのではなく、0〜15のカウンタで処理を分割し、各フレームで一部だけを実行していた。都市シミュレーションでは最大15フレームの遅延はほとんど気にならず、この「処理をフレーム間に分散させる」手法はAssetto Corsaの反射描画やUnrealのLumenにも通じる普遍的な最適化だと著者は説く。

そう、SimCityはシミュレーションの大部分を単にスキップしているのだ。
  1. prosaic-hacker

    これは良い発見だが、何の変哲もない古くからある手法だ。大学卒業後の最初のプログラミングの仕事は、フライトシミュレータ会社のCAE Electronicsで働くことだった。当時のシミュレーションは様々なミニコンピュータで動いていて、私が在籍していた頃は主にDEC Vax 780とその後継機、あるいはGould SELだった。

    記憶が正しければ、シミュレーションはマイクロコントローラ上のスーパーループのように50msか33msごとに動いていた。各ループでディスパッチャがコアとなるシミュレーション関数の中から一部を選んで実行し、毎ループ実行するものもあれば、2回目、4回目、あるいはそれ以上のループごとに実行するものもあった。このシステムはバンディングと呼ばれていた。ディスパッチテーブルは、その特定のシミュレータのニーズに合わせて最適化するために作り直されていた。

    メインCPU以外にも様々な最適化があり、周辺機器も計算を行っていた。また、システムが高速化するにつれて、通常のOSが非リアルタイム要件の低優先度機能を実行するための時間が余るようになった。

    この手法は私の時代には目新しくはなく、およそ10年前の前世代のXeroxシステムでも使われていた。

  2. phire

    > 例えばオリジナルのSimCityは、システム要件にIntelの386SXをCPUとして挙げている。

    これがどこから来たのかは分からない。オリジナル版の箱のアート[1]には、512KBのRAMを積んだ任意のPCで動作すると書かれている。つまり、わずか4.77MHzで動く8088だ。

    しかし、これはこのゲームの最も低スペックな移植版には程遠い。Commodore 64版はかなりの機能(スタジアム、警察署・消防署、鉄道など)が欠けていたかもしれないが、主要な都市シミュレーションループはわずか64KBのRAMと1MHzの6502で動いていた。

    そしてBBC Micro/Acorn Electron版はさらに印象的だった。基本的にフルのAmiga/PC/Mac版の全機能を備えていて、音楽・サウンド・アニメーションだけが欠けていた。2MHzの6502(Electronでは1MHz)とわずか32KBのRAMで動いていた。

    [1] https://images.launchbox-app.com/79861ce4-75ea-46dd-b46e-521...

  3. retrac

    これはGame Boy Color向けのSimCityクローンのmicrocityを思い出させる。

    作者は設計について素晴らしい詳細なドキュメントを公開していて、かなり生き生きと見えるシミュレーションをどうやって8MHzの8ビットプロセッサを積んだマシンに収めたのかを説明している。

    https://github.com/AntonioND/ucity/blob/master/docs/index.rs...

この日のほかの記事

2026-10-24