
2026/03/23 4:02
「最適化のゴールドスタンダード:ローラーコースター・タイクーンの内部を探る」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
クリス・ソーヤーの RollerCoaster Tycoon(1999)は、ほぼすべてのコードをアセンブリで書き、細部にわたる低レベル最適化を施したことで、滑らかなゲームプレイのベンチマークを確立しました。金額は最大想定範囲にちょうど合ったデータ型(ショップ価格は1バイト、総公園価値は4バイト)で保存されており、後にオープンソース再実装 OpenRCT2 ではこれらを統一的な8バイト変数へ移行し、現代のCPUアーキテクチャに合わせました。乗算・除算の代わりにビットシフト(
<</>>)が使用されており、コンパイラが自動で行うはずだった処理を手動で実装しています。
ゲームデザインの決定は性能制約と密接に結びついています。ソーヤーはデザイナー兼プログラマーとして、CPUフレンドリーな計算を優先する設計選択が可能でした。ゲストの移動はアトラクションへ向かう完全な経路探索ではなくランダムウォークに依存しており、多数のエージェントによる高価な計算を大幅に削減しました。パスファインディングは特定のシナリオ(例:乗物修理のメカニック、出口を探すゲスト)でのみ呼び出され、深さ制限が設けられています—デフォルトでは5つのジャンクション、条件に応じて7または8に増加し、フレームスパイクを回避します。混雑した道では同一タイルに複数のゲストが存在でき、衝突回避は完全に省かれ、近接による幸福度計算のみが影響を受けます。
OpenRCT2 はこの元のロジックをリバースエンジニアリングし、現代CPU向けに変数サイズを標準化し、パスファインダーの制限を拡張することで更新しました。これにより、レガシートリックが新しいハードウェアに適応できることが示されました。将来のアップデートでは、衝突チェックや厳密なデータサイズといった古い制約を緩和しつつ、今日のマシンで性能を損なわずにコア体験を保持することが可能です。
これらの洞察は、デザイナーとプログラマーの緊密な協働と意図的な低レベル最適化が、小規模チームでも高性能ゲームを構築できることを示しており、大手スタジオも採用すべきアプローチです。
Text to translate
(including missing points):**
Chris Sawyer’s RollerCoaster Tycoon (1999) set a benchmark for smooth gameplay by writing almost all of its code in Assembly and applying meticulous low‑level optimizations. Money values were stored in data types sized exactly to their maximum expected range (1‑byte for shop prices, 4‑bytes for total park value), and the original engine later shifted these to uniform 8‑byte variables in the open‑source reimplementation OpenRCT2 to match modern CPU architecture. Bit shifting (
<</>>) was used instead of multiplication/division by powers of two, a manual trick that compilers no longer perform automatically.
Game‑design decisions were tightly coupled with performance constraints: Sawyer served as both designer and programmer, allowing design choices to favor CPU‑friendly calculations. Guest movement relied on random walking rather than full pathfinding toward attractions, drastically reducing expensive calculations for thousands of agents. Pathfinding was invoked only in specific scenarios (e.g., mechanics repairing rides, guests seeking exits) and had a depth limit—default 5 junctions, increased to 7 or 8 under certain conditions—to avoid frame‑spikes. Overcrowded paths allowed multiple guests on the same tile; collision avoidance was omitted entirely, with only happiness calculations affected by proximity.
OpenRCT2 reverse‑engineered this original logic and modernized it—standardizing variable sizes for current CPUs and extending pathfinder limits—showing how legacy tricks can be adapted to new hardware. Future updates could relax some of these old constraints (such as collision checks or strict data sizing) without harming performance on today’s machines while still preserving the core experience.
These insights underscore that close collaboration between designers and programmers, coupled with deliberate low‑level optimization, enables small teams to build high‑performance games—an approach larger studios might emulate.
本文
最近、幸運な機会にドイツ最大級のゲームポッドキャスト「Stay Forever」に出演し、1999年リリースのロールコースター・タイクーン(RollerCoaster Tycoon)の技術について語ることができました。素晴らしいインタビューでしたので、ぜひ全エピソードを聞いてみてください――少なくともドイツ語をご存知であればです。もしご不安なら心配はいりません。この記事では発言内容(そしてもう少し)をまとめています。
ロールコースター・タイクーンとその続編は、作成者クリス・ソーヤー(Chris Sawyer)がほぼ完全にアセンブリで書いたことから、「最も最適化されているゲーム」の一つとして頻繁に挙げられます。このゲームは1999年のハードウェア上で数千人のエージェントを含むテーマパーク全体をシミュレートし、ほとんど苦労することなく動作しました。現代でも同様のビルディングゲームが安定したフレームレートを確保できない中で、この成績は極めて印象的です。
ではクリス・ソーヤーはどうやってこれを実現したのでしょうか?
この質問には小さくて具体的なものから、広範囲に影響のあるものまで多くの答えがあります。ほとんどの記事で最初に挙げられるのは「ゲームがアセンブリで書かれている」という事実です。開発当時は特に、高水準言語(CやC++など)よりも、アセンブリを使うことでパフォーマンスの高いプログラムを書くことができました。
アセンブリによるコーディングは長らくゲーム開発の標準でしたが、この時点でほぼ放棄されていました。6年前に発売された最初のドゥーム(Doom)も、Cで書かれた大部分とわずかなアセンブリ部品だけで構成されており、誰もドゥームが非最適化だとは主張しませんでした。
確実に確認するのは難しいですが、RCTはおそらく最後の主要なゲーム開発手法としてこの方式を採用したものです。当時のパフォーマンスへの影響は定量的には測りにくいですが、今日よりも大きかった可能性があります。コンパイラは高水準コードの最適化が格段に進歩し、当時手作業で行っていた多くの最適化を自動で処理できるようになりました。
アセンブリ以外にもRCTのコードは積極的に最適化されていました。ソースコードが公開されていないためにこのことを知る方法はほとんどありませんでしたが、実際に同等に機能する再実装「OpenRCT2」が存在します。
OpenRCT2は熱心なファンによって書かれたもので、オリジナルのアセットを使用してロールコースター・タイクーン1と2を完全に再実装しています。元のソースコードではありませんが(特に初期バージョン)、逆コンパイル作業によりほぼ同一の挙動を再現します。OpenRCT2の最新リリースは、オリジナルコードよりも多くの改善点を含んでおり、それらは本文中で触れていきます。
以下ではゲーム全体がどのように限界まで最適化されているかを示す例を紹介します。
1. 通貨の種類
ゲーム内で金額をどう保存するか?必要とされる最大値を考え、それに応じたデータ型を選択します。クリス・ソーヤーはそれをさらに細分化して行いました。
- パーク全体の価値:4バイト(数値が大きくなる可能性があるため)
- 可変価格のショップアイテム:1バイトのみ(必要な範囲が狭いため)
この最適化はOpenRCT2では削除されています。すべての出現箇所を8バイトの単純な変数に変更し、近代的なCPU上で差がほとんど無視できるようにしています。
2. 数学演算をビットシフトへ置き換える
OpenRCT2のソースには次のような行があります:
value << 2
演算子オーバーロードのおかげで、
<< はビットシフトを意味し、すべてのビットが左に2位置ずれ、結果として数値は4倍になります。同じテクニックは除算にも使えます:
value >> 1 // value / 2 と等価
RCTはこれらのテクニックを頻繁に使用し、OpenRCT2版でも変更されていません。コンパイラが自動で最適化してくれないためです。このビットシフトはオーバーフローやアンダーフロー処理にも有効です。
ビットシフトが頻出するという事実は、RCTの数式が2, 4, 8, 16などの2のべき乗を利用するように設計されていたことを示しています。現代の開発フローでは、プログラマーがゲームデザイナーに「9.5 を 8 に変えてほしい」と尋ねることはまずありません。しかしRCTの場合、デザイナーとプログラマが同一人物だったため、この最適化が可能でした。
3. パフォーマンスを意識したゲーム設計
RCTは実際には完全に一人で開発されたわけではありません。グラフィックはサイモン・フォスター(Simon Foster)が、音楽はアリスター・ブリムブル(Allister Brimble)が担当しました。クリス・ソーヤーが主なプログラマかつゲームデザイナーとして存在したため、パフォーマンスを踏まえた深い最適化が実現できました。
ルート探索(Pathfinding)
単純設計では、各ゲストが乗り物を決めてからその場所へ向かう経路検索を行います。これは数千人のエージェントにとって非常にコストが高いです。RCTでは、ゲストはパーク内を無作為に歩き、交差点でランダムに方向を選び、死角を避けるだけの簡易ルールセットを使用します。交差点に到達すると、新しい方向をほぼランダムに決定します。
この「欠点」はゲーム内でも明らかです。たとえ空腹や渇きがあっても、ゲストは積極的にフードスタンドを探すわけではなく、ただ歩いているうちに偶然見つけるだけです。ただし、特定の場合(メカニックが壊れた乗り物へ向かうときや、ゲストが出口へ行くとき)にはパスファインダーが使われます。ここでの安全策は:
- パスファインダーに個別リクエストごとの探索距離上限を設定
- 上限に達したら検索をキャンセルし失敗を返す
ゲストの思考から「出口が見つかりません」といった失敗を見ることができます。
パスファインダーの制限はゲームプレイにも関わります:
- デフォルトではゲストは最大5つの交差点まで移動可能。メカニックは8。
- ゲストが情報キオスクで販売される「公園マップ」を購入すると、7つに増加。
したがって、パフォーマンス最適化をゲーム設計に取り入れることで、単なるコードの微調整では到底到達できない成果が得られます。
4. 混雑と交通渋滞を避ける
RCTは混雑したパークを、エージェント間の衝突や回避を無視することで処理します。ゲスト同士は衝突せず、同じ経路タイルに複数人が存在できます。この方法で重い衝突判定を排除しつつ、ゲストは周囲の密度に応じて不満を示したり喜びを減らします。
パス設計で過剰な混雑を避ける必要はありますが、完全な衝突や回避システムを実装するよりもはるかに高速です。
5. 結論
RCTの高いパフォーマンスは、低レベルアセンブリコーディングと積極的な最適化(ビットシフト、細分化データ型)だけでなく、計算を削減するゲーム設計の選択肢によって支えられています。クリス・ソーヤーがプログラマとデザイナーを兼ねていたことで、1999年のハードウェア上で限界まで押し上げることが可能になりました。
ゲームプログラミングやUnreal、開発全般に関する私の考え方をフォローしたい場合は、Mastodon、Bluesky、LinkedInで私を見つけてください。また、この記事の下部にあるリンクからブログを購読し、毎月新しい記事を受け取ることもできます。