技術メモ

終盤の処理落ちを測り、持てる武器を6種までにした記録

社畜サバイバーの終盤は、敵が100体を超えると10fps前後まで落ちていました。単独の最適化は実際のプレイではほぼ効かず、武器の数と育ち具合が描画の負荷になると実測で分かり、持てる武器を6種までにした経緯と、その後の修正の記録です。

公開日
AI の利用
AI が作業記録をもとに下書きし、記録との照合を行ったうえで、運営者が内容を確認して公開しています。 編集方針

2026年6月、「社畜サバイバー」の終盤は、敵が100体を超えると1フレームに約100ミリ秒かかり、10fps前後まで落ちていました。AI のエージェントが計測の仕組みを足して原因を切り分けると、重さは1か所ではなく、敵の物理の計算と描画に広く散らばっていました。条件をしぼったベンチで大きく効いた最適化も、実際のプレイではほとんど効きません。一方で、武器の数と育ち具合が、そのまま描画の負荷になると分かりました。そこで6月23日に、持てる武器を6種までにしました。その6日後には、描画の重さの大きな部分が弾の描き方にあったことも分かり、直しています。

何を知りたかったか

調べ始めたのは、運営者の次の要望からです。決定記録067に、そのまま残っています。

終盤(敵100体超)で処理落ちする原因をもっと正確に把握したい。マルチスレッド化・固定デルタ撤去・カリング/バッチ/アトラス・距離判定など、フリーな性能レバーが他にないか

計測と修正の実装は AI のエージェントが行い、見た目が変わる対策は運営者が選びました。6月12日、AI のエージェントは、プレイ中の性能を記録する仕組みを足しました。6月14日には、物理の処理を種類ごとに測っています。終盤の物理の時間56.6ミリ秒のうち、ゲームのスクリプト(敵の生成と動き、プレイヤー、武器、弾、ジェムなど)は合わせて5.6%で、残りの94.4%はゲームエンジンの物理の内部でした。スクリプトを速くしても、物理はほとんど軽くならないということです。

ベンチでは効いて、実際のプレイでは効かない

次に、敵の数、ジェムの数、武器の種類とレベルを、条件ごとに固定して測るベンチを作りました。ここで、いくつかの最適化が大きく効いて見えました。ところが、実際のプレイ(自動プレイを複数の乱数の種で走らせ、敵の数の帯ごとに中央値で比べる)で確かめると、結果は違いました。

施策条件をしぼったベンチ実際のプレイ
弾の当たり判定を自前の距離計算にする+34〜54%ほぼ0%
ジェムの当たり判定をなくす―ほぼ0%
描画の軽量化(エフェクトを減らす)描画命令が減る誤差の範囲(数fps、一貫しない)
物理のマルチスレッド化―改善なし

描画を別のスレッドで動かす設定も試しましたが、画面を出して起動した直後にクラッシュし、採用していません。

ベンチは、弾と敵の当たり判定だけを取り出した、実際にはない状況でした。実際のプレイでは、動く敵の数が物理の重さを決めていて、弾の判定を外しても物理の時間はほぼ変わりません。1フレーム100ミリ秒の中では、数ミリ秒の削減は埋もれてしまいます。時間がたつほど重くなる(メモリなどがたまる)可能性も調べましたが、敵の数を固定した180秒の計測で劣化はありませんでした。6月22日の決定記録は、単一の処理を速くする最適化は実際のプレイですべて効かなかった、とまとめています。

武器が育つほど描画が重くなる

ベンチで、敵を100体に固定し、武器の種類とレベルだけを変えて測りました。

条件(敵100体)fps
武器3種・すべて Lv854
武器6種・すべて Lv832
武器9種・すべて Lv8(ベンチ上の組み合わせ)28
武器6種・Lv161

武器を増やすほど、また育てるほど fps が落ちます。内訳を分けると、増えるのは当たり判定ではなく描画でした。弾の数と、当たったときのエフェクトが増えるためです。当たり判定はエンジン側の仕組みのままのほうが速く、弾の多い条件(9種・Lv8)で自前の距離計算に置き換えると、かえって遅くなりました。物理は動く敵の数で決まり、描画は武器の量で決まる。終盤の fps を上げるには、武器と敵の両方を抑えるしかなく、それはゲームの手応えとの引き換えになる、というのが6月22日の結論です。

持てる武器は6種まで

6月23日のコミットで、持てる武器を6種までにしました。武器の枠が埋まると、レベルアップの候補から新しい武器を外し、持っている武器の強化と進化、補助の強化だけを出します。選べない武器を見せておく形は採りませんでした。当時の武器は8種で、そのうち6種を選ぶ取捨選択が生まれ、終盤の弾の量にも上限がつきます。候補が尽きた場合は回復の強化が出るので、進めなくなることはありません。自動プレイに本社オフィスを2回(1回は途中で敗北)遊ばせ、6種で止まること、進化が起きること、エラーが出ないことを確かめています。

同時に、設定に「軽量モード」を加えました。当たったときの粒やダメージの数字を減らす、ゲームの挙動を変えない描画の削減です。ベンチの武器が多い場面では fps が30%上がりましたが、実際のプレイでは1〜2ミリ秒ほどしか下がりませんでした。武器の上限のようにゲームを変える対策と、軽量モードのような害のない削減を分けて、後者は選べる設定にしています。

6日後に見つかった描画の重さ

6月29日、描画を種類ごとに測る仕組みを足すと、原因がはっきりしました。画面を描かない状態で自動プレイを走らせても fps は崩れず、画面を描くときだけ60から9まで落ちていました。名刺弾を毎フレーム描き直す処理が、図形を描く処理の時間の69%を占め、武器のレベルとともに増えていたのです。

弾を、毎フレーム描き直す方式から、画像を動かすだけの方式に変えました。当たったときや倒したときのエフェクトも、GPU で処理する粒子に移しています。図形を描く処理の時間は合計で約7.5ミリ秒から約1ミリ秒になり、開始250秒の時点の fps は9から42に、山場でも22〜50fps を保つようになりました。名刺弾は最大12発を9発に減らし、威力を7から8に上げて補っています。

6月22日の決定記録は「フリーな性能レバーは実証的に尽きた」と書いていました。ところが、この修正の大半は、ゲームの挙動を変えない描き方の置き換えです。7月にまとめた文書は、効いたのは「実体総数の削減」と「描画コストそのものの撤廃」の2系統だけで、既存の処理を賢くする最適化は実際のプレイでことごとく効かなかった、と整理しています。武器の上限は前者に、弾の描き方の変更は後者に当たります。

7月に足したこと

7月9日には、回復アイテムのコーヒーが、物理の処理のたびに描き直しを頼み、1フレームに1000〜2000回描かれていた問題を直しました。コーヒーは HP が減っているときだけ落ちるため、被弾する山場でだけ重くなる一因でした。それ以来、描き直しの依頼は物理の処理から出さない決まりにしています。

同じ日、軽量モードの中身を、運営者の案どおり、物理演算を30Hzに減らして補間で滑らかに見せる形に変えました。エフェクトを GPU に移した後は、粒を減らしても数%しか効かなくなっていたためです。処理落ちしたときにゲーム内の時間を実時間に合わせるかどうかも、運営者の要望で「処理落ち時の時間維持」として3段階から選べるようにしました。

計測で学んだこと

  • 条件をしぼったベンチは、取り出した要因を大きく見せる。必ず実際のプレイで確かめる
  • 画面を描かない自動プレイでは、描画の問題は見えない。重さは画面を描いて測る
  • 自動プレイの武器の選び方しだいで、描画命令の数は±15%、1フレームの処理時間は±4ミリ秒ほど揺れる。それより小さい改善は、効いたと言えない
  • 見た目を変える対策は、運営者が選ぶ。ジェムを画像に置き換える案は、見た目の変化を運営者が好まず、戻した

持てる武器と軽量モードは、社畜サバイバーのゲームページでも紹介しています。自動プレイの数字が描画の問題を見落とした件は、自動プレイの計測を面白さの証拠にしない線引きの制作ノートの考え方にもつながっています。

制作ノートの一覧へ