ディスカッション (10件)
パフォーマンス最適化の「究極の教科書」として語り継がれる『ローラーコースタータイクーン』。ほぼ全編がx86アセンブリ言語で書かれているという、現代の常識では考えられないような開発手法と、その圧倒的な動作効率の秘密を技術的な視点から紐解きます。
RCTがアセンブリで書かれてるって話はよく聞いてたし、すごいなと思ってた。でも、実際にアセンブリを深掘りし始めるほど、このタスクがいかに途方もなくて不可能に近いかが分かってきたよ。フォークがあるなんて知らなかったから、チェックするのが楽しみ。
面白い記事だね、サンクス!RCTについてはこれもオススメだよ: "Interview with RollerCoaster Tycoon's Creator, Chris Sawyer (2024)" https://news.ycombinator.com/item?id=46130335 "Rollercoaster Tycoon (Or, MicroProse's Last Hurrah)" https://news.ycombinator.com/item?id=44758842 "RollerCoaster Tycoon at 25: 'It's mind-blowing how it inspired me'" https://news.ycombinator.com/item?id=39792034 "RollerCoaster Tycoon was the last of its kind [video]" https://news.ycombinator.com/item?id=42346463 "The Story of RollerCoaster Tycoon" https://www.youtube.com/watch?v=ts4BD8AqD9g
2の累乗の乗算や除算をコンパイラが最適化してくれないなんて、この記事はどこの言語の話をしてるんだ?符号付き整数の除算ですら、最近のコンパイラは正負の値を別々に処理するインラインコードを吐き出すし、除算命令を避けてくれる(もちろん、サイズ最適化を優先してない限りはね)。
「技術的な必要に迫られた最適化を、ゲームプレイの仕様に変えてしまう」 これこそが、最適化コンパイラが十分な量の人間による最適化に絶対に勝てない理由だよ。人間なら、パフォーマンスのためにいつ抽象化レイヤーをあえて壊すべきか判断できる。コンパイラにはそれは無理だ。
「プログラマーがゲームデザイナーに、CPUが計算しやすい数字だから計算式を9.5じゃなくて8にしていいか聞くのを想像してみてほしい。ゲームデザイナーがバイナリ演算の実行時の特性なんて一生気にしなくていいというのは、筋の通った主張だ。それはプログラマーの宿命だから」 数値の特性は、2026年になってもゲームデザイナーにとって絶対に考慮すべきことだよ。デザインにどの数字を使うかに影響するしね。優秀なデザイナーならの話だけど。もちろん、最近はこういうのを無視するダメな開発者やデザイナーも腐るほどいるけど、それはコストがかからないからじゃなくて、単に知らないだけ。多くの場合、それがゲームの質の低下を招く静かな要因の一つになってるんだ。
「同じトリックは、除算を減らすために逆方向でも使える: NewValue = OldValue >> 3;」 値が負の場合はうまくいかないから、注意が必要だよ。
素晴らしい記事だね。ありがとう、本当に最高!Factorioのブログを思い出したよ。あのゲームは今の基準で見てもとんでもない最適化の塊だし、それがデザインと上手く噛み合ってると思う。面白かったのが、1万個の銅コイルが乗った長いコンベアベルトがあるとき、入り口と出口のタイルだけをアクティブにすればいいって話。ベルトが満杯か均一に埋まっている限り、他のタイルは動かす必要がないんだ、何も変わらないからね。だから、それを妨げるようなメカニクスは避けるようになってる。
「同じトリックは逆方向、つまり除算を省くためにも使える: NewValue = OldValue >> 3; これは基本的には NewValue = OldValue / 8; と同じだ。RCTはこのトリックを多用していて、OpenRCT2版でさえ、コンパイラがこの最適化を代わりにしてくれないので、この構文は変わっていない」 (強調は筆者によるもの) これ、全然事実じゃないよ。>> が / と等価になるような型であれば、最近のコンパイラなら2の累乗による除算は例外なくシフト演算として実装するはず。
RCTを遊んでからしばらく経つけど、このゲームの本当にいいところはWineで完璧に動くことだね。ソースコードが見れたら最高なんだけどな。