Rimworld パフォーマンス改善とDubs Performance Analyzerとかの話

2024/04/15 追記

以下の情報は1.4までのものになります。

Performance Analyzerなどの情報は変わっていないはずですが、modの状況は最新の状態を反映できていないと思います。

描画関連が公式でマルチスレッドに対応したことにより、環境が変わらずとも多少のパフォーマンス増加が見込めると思います。

追記終わり

 

 

こんちわ~~~~

Rimworldをmod盛り盛りでやると、中盤以降(modの数によっては始めた瞬間から)強烈なFPSの低さに悩まされることになると思います。
この記事はそれを改善・軽減するための忘備録となります。
自分で調べたことが殆どな上、技術屋でもないので間違っている箇所も多分あります。

ま、話半分に見ればいいんじゃないかなと思います。

 

また、Dubs Performance Analyzerの使い方とかについての話もちょっとします。

 

 

#重要

modの数が10個や20個程度ならこの記事を読む必要はありません。
その程度ならPCスペックの問題の方が大きく、スペックに余裕があるならその程度の数なら重いmodを使用しても問題ありません。
ちなみに僕は大体200~300個です。日本語化modを抜けば150~250個ぐらい?

 

この記事にmod製作者を攻撃するような意図は全くありません。
基本的には大量のmodを使っているユーザー側の問題であり、重いとされているmodの作者に対し、パフォーマンスの改善要求を出すだとか、暴言を吐くだとかは絶対にやらないでください。

-----------------------------------

#前提

modというものに対してある程度の理解があることを前提として話しますが、補足もいれます。わからなかったら調べてください……。

 

この記事では、FPS・TPSという単語を使用します。


FPSはFrame Per Secondの略であり、1秒あたり何回画面が更新されるかを表します。
このゲームでは60FPSが上限値として設定されており、どれだけ高リフレッシュレートのモニターを使っていても60FPSまでしか出ませんし、解除する方法も(多分)ありません。

 

TPSというのはTick Per Secondの略であり、TickとはRimworldのゲーム内時間の最小単位のことです(多分ちょっと違うけど表現がわからん……。)。
全く問題なくRimworldが動作していれば、"RT1秒*1=60Tick=IGT1.44分*2"となります。
n倍速のときはTickがnだけ乗算されており、3倍速では"RT1秒=180Tick=IGT4.32分"となります。


つまり、等倍速であれば1秒で60Tickの処理ができなかったとき、3倍速では1秒で180Tickの処理ができなかったとき、FPSが落ちます。

 

ちなみに、ゲーム内速度は等倍速(60Tick)、3倍速(180Tick)、6倍速(360Tick)の順で並んでいます。*3


更にこの上にバニラ(modを1つも入れない状態)では開発者モードでのみ使用可能な15倍速があります。

 

バニラであれば適当なPCでも動くと思いますが、modを盛っていくと処理に時間がかかり、6倍速はかなり厳しくなってきます。

ゲームそのものがCPUのマルチスレッドに対応しておらず、シングルコアのみで処理しているせいでハイスペックなPCでも激烈に重くなります。

 

バニラで重いならまずPCを買い替えてください。

-----------------------------------

#1 動作が重いmodの確認

 

ここからが本題です。
"Dubs Performance Analyzer"というmodを使用することで、どのmodが重いかを絞り込むことができます。
使用方法は各自調べてもらうとして、ここでは画面の見方をある程度解説します。一応、日本語化前提です。

 

画面下部、Dubs分析というボタンを押します。

タブの中の"更新(Update)"を開き、"Harmonyパッチ"を見ます*4



必ず20秒以上はゲームを等倍速以上で動作させてください。
ここでは分かりやすくするため、わざと動作を重くしています

 

ここで見るべきは"最大(Max)"と"平均(Average)"になります。
クリックするとソートできるので、最大や平均でソートし、高いものを確認します。

スタッターやプチフリが発生している場合、"最大"でソートして確認します。
15msを超えるものがあれば、そのmodが原因でスタッター・プチフリが発生していると見ていいと思います。

 

常に動作が重いときは"平均"でソートし、0.1~0.2ms以上のものを確認します。
特に0.3msを超えているものは出来るなら外したほうがいいmodだと思います。


上の画像ではWorkTabが強烈な重さであることがわかります。(わざと動作が重くなるように動かしています!*5

-----------------------------------

#2 重いmodが知りた~い!

 

さて、ここまでで導入しているmodのパフォーマンスを確認することはできましたが、これからmodを導入するにあたってそのmodのパフォーマンスを知っておきたいということも勿論あると思います。


有志がまとめたmodリストを確認してみましょう。

 

Noob Friendly Performance Mod List(以下NFPML)
https://docs.google.com/spreadsheets/d/12mAva1anZribuz6PmNoTJvTq5AdgarPyiB1cd1pFsMg/edit#gid=1968762060


Slow Mods
https://docs.google.com/spreadsheets/d/1qwwKyUbSHFGM6yqw_e4tyWFbIYDxAibOvbcTrNOQ3bo/edit#gid=1731985214

 

この2つを"ファイル"→"コピーを作成"で自分のドライブにコピーしてから確認することにします。
NFPMLは"Nasty Mods"を、Slow Modsは"Slow Mods"というシートを見て、それぞれ翻訳しながら確認してみるといいでしょう。

-----------------------------------

#3 重いmodの解説

 

#2のリストで重いとされている中から、有名どころとかを適当に"Reason(理由)"を訳したりとかしながら少し解説します。

 

・RimThreaded
なんとNFPMLでは"CRITICALLY GAMEBREAKING(致命的なゲーム破壊)"に分類されています。
このmodはRimworldをマルチスレッド対応にさせるmodですが、他のmodがマルチスレッドに対応できず、互換性のある一部のmodのみしか併用できません。
無理やり使おうとするとクラッシュやエラーが頻発してゲームにならなくなります。
バニラであったり、互換性がある一部のmodのみを使用したプレイならマルチスレッドに対応しなくても基本的に重くならないので、使用する意味は今のところないと思います。

 

・RuntimeGC
最近SteamWorkshopから消えたりしました。
不要な情報を削除することでゲームを軽量化するmodですが、他modとの互換性が失われる場合がある上、エラーの原因となります。
元々、バニラのガベージコレクタを改善する目的で作られたようですが、今はバニラもまともなGCが実装されています。
大量のmodと長いプレイ時間によりセーブデータが肥大化してしまって、どうしてもクリーニングしたい場合は"Save Cleaner"を使用してください。
Discordの"Dubs Mods"サーバーで配布されており、RuntimeGCより圧倒的に安全です。原理は知りませんが……。

 

・EdB Prepare Carefully
単純に古く、他のmodとの互換性がありません。
単体で使うならまだまともかも……?とは思いますが、Reasonには
"ポーンの改造に古い方法を使っているため、ポーンが時限爆弾と化し、セーブデータを破壊する可能性がある。種族modやheddifを使うmodの多くと競合する。"
と書いており、使わないほうが良いとは思います……。
代替品は"Character Editor"です。UIはEdBのが使いやすいんだけどな~……。

 

・新規タブを追加するmod
NumbersCorpseTabWorkTabなどのことです。WorkTabは#1でも使いましたね。
これらのmodは、パフォーマンスの問題を引き起こすのはタブを開いているときのみ、という特徴があります。
つまり、タブを開く前に一時停止すればほぼ無害ということになります。
WorkTabの代替品に関しては、"Personal Work Categories"が使えます。

 

・Auto Light Switch
このmodだけでなく、ライトをつけたり消したりするmodは全てパフォーマンスに悪影響がでます。
mod側ではなく、バニラ側の光源の処理方法に問題があるからです。

 

・Pocket Sand
複数のポーンを選択したときにパフォーマンスに強烈な影響がでます。
"Performance Optimizer"を導入することでマシになります。
代替品は"Simple sidearms"です。simple sidearmsより軽いと書かれていますが、simple sidearmsの方が軽いようです。

 

Infusion 2
Discordを見る限り、人によるっぽいです。
一応"Infused"のほうが軽いらしいですが、よくわからないです……。

 

・Gastronomy
レストラン運営したかったよ~~~!
どうやら備蓄してある食料をすべてスキャンするらしく、スキャンするタイミングでラグが発生します。
備蓄の量に比例してラグもデカくなるらしい。
なおスキャンしていないときも平均6ms程度の悪影響があるようです。厳しい……。
Cash Register側にも問題がある可能性があり、最近出た"Hospitality: Storefront"もちょっと怪しいです。
どうしてもレストランを運営したい場合はGastronomy以外のmodを出来る限り減らしましょう。

 

・Perfect Pathfinding
これに限らず、経路探索を行うmodはできる限り避けるべきです。
ただし、"Clean Pathfinding 2"のみパフォーマンスに良い影響を与えます。何故?
使うなら"Clean Pathfinding 2"にしましょう。

 

・Raise The Roof
重い。
"Dubs Mods"サーバーに改善されたバージョンがアップロードされており、それはかなり軽いです。
改善されたバージョンは1.3向けですが、1.4でも動作するとのこと。
バージョンのエラーが邪魔だったらabout.xmlをちょろっといじってどうにかしましょう。

 

・Smart Medicine
・Pharmacist
ポーンが多くなればなるほどラグが増えます。
代替品は"Choose Your Medicine"です。

 

・RimFridge
このmodは温度を管理してアイテムの腐敗を防ぐので、ちょっと重いです。
代替品は"Simple Utilities: Fridge"です。中に入っている食材の腐敗コードを停止させるだけなのでこれに比べて軽いです。

 

・Replace Stuff
めっちゃ便利だけど、機能を使っていないときでもパフォーマンスに悪影響を与えます。
代替品もないので泣く泣く外すか、他のmodを最適化しましょう……。

 

・[NL] Facial Animation - WIP
ポーンが増えるほど影響が大きくなります。そりゃそうじゃ(オーキド)。
無いと物足りないので僕は使い続けます。

ポートレートでのアニメーションをオフにするか、更新レートを遅くすることによって多少の改善が見込めます。

 

・While You're Up / PUAH+
運搬可能なアイテムをチェックするため、常にパフォーマンスに悪影響を与えます。
Pick Up and Haulだけでも十分バニラより速いので我慢するしか……。

2023/07/21

コードが最適化され、軽量化に成功しているようです。

 

・RimHUD
ポーンを選択したときにラグが発生します。
RimHUDの設定から、更新頻度をデフォルトの500msより上にすればするほどマシになり、最大の3000msではほぼ直ります。

 

・Interaction Bubbles
ポーンが多いと悪影響が出る場合があります。
"Owlchemist*6"さんのGithubに軽量化されたフォークがあります。

 

・[JDS] Simple Storage
LWM's Deep Storageの拡張modです。
デケェストレージを作ると重くなります。詳しく言うなら、1タイルに対して25個以上のスタックを存在させるとヤバい。
Deep Storageだけで対応できない場合はOgreStackとか使ってスタック数増やしたほうがパフォーマンスは良いです。
また、"Project Rimfactory"というmodのDSUは大量のアイテムを保存するのに最適な物であるらしく、大量に物を溜め込みたい人はそれを使うべきとのこと。*7

-----------------------------------

#4 軽量化mod

 

#3とは逆に入れ得なmodを紹介していきます。

 

・RocketMan
みんな大好き。とりあえず入れる。

 

・Dubs Performance Analyzer
TPSの確認や重いmodの絞り込みだけでなく、最適化の機能までついてくる。

 

・Performance Optimizer
これも最適化mod。UIをマウスオーバーしたとき以外非表示にしたりすることで更に軽くなる。

 

・Performance Fish
最適化mod。マジで入れ得だけど、僕の環境では"WorkGiver_DoBillOptimization"の上2つが同時にチェック入ってると右クリックからクラフトができなくなったりした。

"TryFindBestIngredientsInSet_NoMixHelper"か"TryFindBestIngredientsHelper_InnerDelegate"のどっちかのチェックを外す。

恐らく前者を外したほうがいい……たぶん。

2023/06/16

バグフィックスがされた最新版がアップロードされ、既知のバグはなくなりました。

 

・Toggleable Readouts
・Toggleable Overlays
オーバーレイを非表示にしたりしてパフォーマンスを上げる。
Performance Optimizerとは違う部分。mod設定から色々いじれる。

-----------------------------------

#5 テクスチャの最適化

RimPyには、テクスチャをddsに圧縮する機能があります。
"Graphics Settings+"というmodが必須になりますが、ロード時間の短縮やパフォーマンスの向上が見込めます。

わからん人はやらない方がいいかもしれないです。

 

使い方はめっちゃ簡単で

RimPyの右側にある"Optimize tex"をクリック。
開いたウィンドウの右上にある、"SelectAll"を押したあと、入っているなら手動でリテクスチャmodからチェックを外します。
"BC7 Texconv Compressor(GPU, high quality)"を選択し、Upscale settingsの下にある"Convert new textures only"にチェックを入れます。


あとはConvert texturesを押すだけで終わりです。簡単~~~!!

 

modの数が多ければ多いほど時間かかるのでしばらく本読むなりして時間を潰しましょう。

ddsに変換してからの最初の1回目の起動はキャッシュ作成のために起動時間が長いままですが、2回目からは劇的に速くなります。

-----------------------------------

#6 modのロードオーダー

 

一番難しいし、宗教戦争が絶えません。

 

redditや海外のdiscordなどでは、Sortを押し、全てをRimPyに任せるべき。とされています。


RimPyでSortを押したとき、まずabout.xmlの情報を元に並び替え、その後にコミュニティのデータベースに従ってソートします(ここは逆かも知れない)。

最後に、データがないmodを名前順で並び替えます。

 

Rimworldのロードオーダーはカテゴリ毎にソートする、などということが意味をなさない(らしい)ので、出来る限りデータが存在しているRimPyに従おうというのが主流らしいです。


データがあるmodが殆どの場合は恐らく全く問題ありませんし、素人が並べるよりはマシに思えるのでこの主張は正しいように感じています。
ベセゲーでLOOT使ったりするのと感覚は似ている気がします。

 

が、ちゃんとmodの説明ページを読むことは忘れないようにしましょう。
Sortボタンを押し、必要ならその後に手動で修正を行うのが正しい……と思います。

 

例えば、"kaitorisenkou"さんの"ModularWeapons"はロードオーダーを上の方にするよう指示されています。
Bug reportスレッドでは恐らく"Common Sense"と競合しているとの報告があり、少なくともそれよりは上にするべきであることが伺えます。
導入していたときは"HugsLib"の一個下に置いていました。

 

僕の環境の例を出すなら、Sortを押したあと
"Startup impact"を"Performance Fish"の上に置く。*8
"Graphics Settings+"を"HugsLib"の下に置く。
"Dubs Performance Analyzer"と"Performance Optimizer"を"RocketMan"の上に置く。*9
"Hospitality"と"Hospitality: Casino"を"Dubs Performance Analyzer"の上に置く。*10
"Paniel the Automata"とその関連modを"Hospitality"の上に置く。*11
みたいな感じでやってます。

 

2023/05/28 追記

Sortを押すと"RocketMan"がほぼ確実に一番下に来ると思いますが、そうでない場合は手動で一番下に置きます。

上の例だと、最下部付近のロードオーダーは

Paniel the Automata

Hospitality

Hospitality: Casino

Dubs performance Analyzer

Performance Optimizer

RocketMan

という順番になっています。

紛らわしかったので脚注にも追記が入れてあります。

-----------------------------------

#7 最後に

Dubs Modsサーバーはマジで入り得で、パフォーマンス狂信者達が重いmodのコードを書き換えて軽くしたりしています。意味不明。
重いとされているmodに色をつけてわかりやすくしてくれるRimPy用のConfigが便利です。

-----------------------------------

#8 おまけ Dubs Performance Analyzerの解説をちょっとだけ

Tickに関しては前提でちょっと説明しましたが、これの補足をちょろっとやります。

 

まずは等倍速で60FPS動作させたいときを考えてみます。
等倍速なのでゲームは60Tickで動作しようとします。
1秒間に60Tickなので、1Tickあたりおよそ16.666...msで処理しなければいけません。
めちゃくちゃ簡単にいえば、Dubs Performance Analyzerで出ている平均の合計のとこの値が16.666...ms以下なら等倍速で60FPSが維持できるという訳です。*12

1Tickの処理がそれを越えてしまったときにFPSが落ちる可能性が出てきます。

 

ゲーム内速度2なら180Tickで動作させようとするので、1Tickあたりの猶予は5.555...msまで低下します。
速度3なら360Tickなので更に猶予はなくなり、2.777...msです。
2.7msほどしか猶予がないのに、1つのmodで0.3msとか持っていかれると凄い顔になってしまいますね。


とにかく、無くても困らないmodなら抜きましょう。
平均0.1msでも、それが27個あるだけで限界を迎えてしまいます。
180Tickならそれなりに気をつけていればなんとかなるので、ゲーム内速度2で遊ぶのも手です。

 

なんとなく、"最大"が高いとプチフリが発生しやすくなる理由、"平均"が高いとFPSが安定しなくなる理由は掴めたでしょうか?

僕からは以上です。

*1:リアルタイム

*2:インゲームタイム

*3:プレイヤーが操作できるポーン全員が睡眠しているとき、更に2倍されます。

*4:Tickを見るのはちょっと難しいです。Dubs ModsサーバーでもまずHarmonyパッチを見ることが推奨されています。

*5:WorkTabに対する批判ではないということだけはわかってください。お願いします……。

*6:mod製作者。または神のこと。

*7:ただし、IOポートを必ず1つ以上用意すること。とされています。

*8:Startup impactは自分より後に読み込まれたmodに対して動作するので、必要がないならPerformanceFishの後でも問題は発生しない。

*9:パフォーマンス系のmodは出来る限り優先度を上げたい。RocketManが一番下で、他のパフォーマンス系modはそれのひとつ上に置きます。

*10:優先度は高いほうがいいとのこと。パフォーマンス系modの真上に置きます。

*11:優先度高くないと制作時にプレビューがバグった。優先度はHospitalityよりは低く、それ以外の全てより高いです。

*12:ちょっと自信ない。間違ってるかも。