「Stellaris」の開発日記#170が公開されていましたので、その内容をご紹介。今回はパフォーマンスとその他の技術的問題について。Federations発売前の開発日記です。
開発日記
開発日記#170は、今回はパフォーマンスとその他の技術的問題について。
繊細なバランス
- Stellarisやこのようなそれなりの規模のコードベースのほとんどはミカドやジェンガのような複雑なゲームと同じだ。すべての部分がなんらかの方法で他の部分につながっている。機能を追加すれば接続も追加することになる。
- 注意深ければ少数のものだけを追加するが、急いでいればあまりに多くのものを追加してしまう。これは一般に計画していない機能(またの名をバグ)につながる。さらに、実際のゲームでそうしたものが動作するのを確認すると、私たちは新しい予期しない方法で機能を拡張する傾向があり、さらなる計画していない機能につながる。
- なにが起こっているのかを理解すれば、より慎重になる。慎重になりすぎるかもしれない。あまりに多くのことをあまりに頻繁にチェックし、関連性について実際に起こり得ないことが確かに起こらないのを確認する。
- そうして計画していない機能を取り除くが、ゲームはあまりにも慎重すぎる。つまり遅い。そこでこうしたチェック機能を削除する。銀河全体に対してループさせる必要はなく、ひとつの小さな惑星についてのみでよいと気づく。さらに一歩進んで、「3週間ごとのチェックでいいだろうし、こうしたチェックに必要な計算は次の変更があるまで保存して再利用しよう」と考える。
- そうしてゲームはもはや慎重ではなくなり、私たちは計画していない機能に立ち戻る。しかしキャッシング(計算結果の保存と再利用)が異なるマシンで異なる時間に発生する場合、少し異なる結果(開発者がコーヒーを飲んだ前か後かということを尋ねるような)を得る。
- 少し異なる結果がどれほど同期ズレ(OOS)を発生させることか! クライアントとサーバーで0.0001のコストの差があれば、時間経過で積み重なっていき、サーバーではコルベットを購入しているがクライアントはそうではないというようなことになる。
- そうして「スマートな」アルゴリズムを取り除き、これを正しいものに置き換える。ステップ2で得たものの半分を失い、バグをいくつか再導入することになるだろう、おそらくは。同じことの繰り返しだ。
パフォーマンス
- StellarisのファンはC++のプログラマーのようなものだ。パフォーマンスが常に念頭にある。公平を期すために言うと、最近の私たちも非常に気にしている。特にゲーム終盤や大きな銀河では、それほどパフォーマンスがよくないことを私たちは認識している。
- これを踏まえて、私たちはいつもよりも少し深いところでパフォーマンスを改善することに時間をとった。最も時間がかかっているものを調べたが、誰もが知っているように……。
Pop
- Popが多くの時間を使う理由はたくさんがあるが、主なものはゲーム終盤でPopをあまりにも大量に持っているということだ。あまりにもあまりにもあまりにもあまりにもあまりにも大量にだ。そしてPopは非常に多くのことをやっている! Popはそれぞれの仕事がどれほどうまく行っているか計算しなければならない(7日ごとに行っている)。
- さらに、Popは最適な職を求めて惑星の他のPopと競争しなければならない。その上、Popが特定の志向を持っている場合はチェックもしなければならない。派閥に入れるか、どれくらい幸福か、どれくらい幸福になれるか、惑星全体でPopはどれほど幸福かについてもだ。
- こうしたことすべてが補正の計算のトリガーとなる。私(注:Stellaris技術リードのMoah氏)の前回の開発日記を覚えていれば、StellarisではPopより膨大な数がある唯一のものは補正であると知っているだろう。補正はすべて互いに依存関係にあり、その計算は1本の糸を引っ張ってセーター全部を解くようなものだ。
オーケー、じゃあ実際にはなにをしたの?
- 第一に、「いつ新しい職が追加されるかわからないので、毎日職の配分を行う」というのは少し頭が固かったことは認める。この仮定を再検討し、職の配分は要求があったときのみ行うようにした。さらに、繰り返すものがずっと少なくなるように書き換えた。
- また、奴隷化されているか、退廃しているか、その他種族レベルでチェックされるものを、帝国全体のPopについてチェックするトリガーがいくつかあることに気がついた。そこでこうしたことを種族レベルでチェックする新たなトリガーを作った。同様に、艦隊を見つけるためにすべての艦船を見るイベントがあったため、艦隊レベルのトリガーを追加した。
- 第二に、Popが変えられるか(そしてもう一度機能するようになったか)、あるいは派閥に加入できるかをチェックするアプローチを見直した。
- 最後に、マルチスレッディングを使用するさらなる機会を探した(そして見つけた)。
- 1枚の絵は1000語に値するというなら、これが毎秒3万語にのぼる答えだ。(21:20追記:コメントにてご指摘いただき表現を修正しました。ありがとうございます)
- この動画では、コミュニティからのセーブデータを走らせたときの2.5.1「シェリー」と2.6「ヴェルヌ」のパフォーマンスを比較しており、このセーブデータはこの投稿に合うように探したもので、2万Pop以上が存在する。
- 私の仕事用PC(Intel Core7-7900X @ 3.30Ghz(10コア20スレッド)、AMD R9 Fury)で録画したもので、みなさんのコンピューター、みなさんのセーブデータで必ずしも同じ結果が得られるわけではない。
- 平均して、ゲーム終盤では15-30%の改善が見られる。このセーブデータはPopに対する改善の影響を見るには理想的だ。
この平均ってなに? どうやってわかったの?
- 私たちは毎晩ゲームを一晩中やる人工生命体を持っている。朝になると、私たちは彼らがどこまでできたかチェックする。発生したエラー数、ゲーム終盤の様子、同期ズレが起こったかどうかを尋ね、そうしたものすべてをさまざま色を使った表やグラフにする。その後人工生命体は廃棄するので、魂やその他の厄介な質問はしない。
まとめ
- 私たちはパフォーマンスを念頭に置いて合理的な範囲で最善を尽くしているが、この問題についてより深く掘り下げる機会を得られてうれしく思う。こうした変更がみなさんの楽しみにつながることを願うとともに、みなさんからのフィードバックを楽しみにしている。
- (スレッド内のその後の投稿)ベータテスターの一人からこの画像を投稿するように頼まれた。以下はコメントの引用。
- この画像はi5-3570KベースのPCからのものだ。古いビルドに対する改善の比率は2300年まで平均10%遅くなっている。その後速度は向上し、2500年までには50%早くなる。最初の100年はPopが増えたことで説明でき、改善がまだ始まっていない。その後は終盤まで非常に早くなっている。実際はPop数について直線的だと思うが、何度か戦争が起こったので面白い形になっている。結局のところ、Popの数が増えたことを考えれば、2倍くらい早くなっている。
質疑応答
Q1:Popの量を減らすのはどうなの?
A1:考えたし、grekulf(注:Stellarisゲームディレクター)やデザインチームとも議論した。しかしプログラマーとしては、技術的制約でゲームデザインを変えるのは気持ちいいものではない。
Q2:ゲームタスクごとにスレッドを使わないのはなんで?(もちろん充分なスレッドがある場合だけど)これでCPU使用率が大幅に上がって早く処理できる可能性がある。
A2:問題の1つはゲームが補正に基づいていることだ。ほとんどすべてのものが補正で、補正は別の補正を受け、それがどのような状態であるかわからないので、簡単に補正計算をスレッド化できない。国家に依存する惑星に依存するPopのように、依存関係の連鎖があるため、並べて並列化することができない。
こうしたことは不可能ではないが、「よし、あらゆることを書き直すのに6か月間Stellarisの開発を止めよう」ということになる。要するに、パフォーマンスを向上させるためにこうしたことが必要だとは思っていない。スレッドプールの戦術的な使用は大いに役立つし、リライト量がずっと少なくても大きな結果を得られる場所をいくつか考えている。
開発日記#171は「Federations」発売日発表の配信についてですが、当サイトでは記事にしませんので、気になる方は直接フォーラムをご覧ください。「Federations」発売日発表についてはこちらの記事をご覧ください。
コメント
毎日一晩中パラドゲーをやる人工生命体なりたい
いや、2400年以降が軽くなったところで…
> 「よし、あらゆることを書き直すのに6か月間Stellarisの開発を止めよう」
新規要素よりこっちしてくれたほうが既存ファンは喜びそうな気がする
パフォーマンス改善DLC誕生の日も近いな・・・
ステラリス2早くしてくれと思うことになるとは
どうでもいいことではあるけど、百聞は一見にしかずに訳しちゃったせいでstellarisのfpsが300f/sになっちゃってる
恥ずかしいミスをば……。
修正しました。ありがとうございます。
> 「よし、あらゆることを書き直すのに6か月間Stellarisの開発を止めよう」
OK、すぐに開発を停め、さっそく改良にとりかかってくれ
> 「よし、あらゆることを書き直すのに6か月間Stellarisの開発を止めよう」
そこまでやったとして、結局その次の大型アプデで元の木阿弥ってオチじゃないかな、とか思ったり。
技術的な命題に取り組まず会議中の雑談の種になるよりはよっぽどいい
ただコンテンツを追加しやすい構造に最初からしていればな…
いやPOP素直に減らせよ
こんなにいらないでしょ明らかに
中盤以降失業者だらけの惑星しかないんだからマジで無駄だよね
ある程度人口増えたら増加率減る方が現実的だね
自動POP移動とか色々やったら2370年時点で20000POP超えてもう重いです
POPを圧縮して統合できりゃなぁと思うわ
POP増えすぎるなら人口抑制令出して、どうぞ
リングワールドに失業者押し込むといいぞ
なおAI
POPいらないと思うの
Ver2.0以前の方がPOPのシステムは洗練されていた気がする
リングワールドですら25枠しかないけど巨大な人口を扱う時はどんどんPOPをマージしていくような仕様にすりゃいいし