「作ったゲームがカクカクする」「どこが重いのか分からない」
ロブロックス(Roblox)で作ったゲームが重いときの直し方を、実際の画像付きで誰でも簡単に分かるように解説します。この記事では、わざと重くしたスクリプトを使って、どこが重いかを測る→1つだけ直す→同じ方法で測り直す流れを練習します。
中級ステップ17/28 前の記事:ロブロックス(Roblox)スタジオでタイクーンを作る方法 全体の順番を見る
使うもの:Roblox Studioが起動するパソコン、重くなっている作品(練習なら新しいBaseplate)。スクリプトの入れ方はスクリプトの作り方で解説しています。

直す前に決めておく3つのこと
「重い」と感じたら、いきなり部品を消したりコードを書き直したりせず、まず次の3つを決めます。
| 決めること | 例 |
|---|---|
| どの場面で重いか | スタート直後、敵が増えたとき、画面を開いたとき |
| どの端末で重いか | パソコン、スマホ、2人以上で遊んだとき |
| 比べる条件 | 同じ場所、同じ人数、同じ操作 |
直す前と後で同じ条件で測らないと、本当に軽くなったのか分かりません。
練習:わざと重いゲームを作る
練習として、800個の小さなパーツを毎フレーム回し続けるスクリプトを使います。Studioのホーム画面の左の「テンプレート」から「Baseplate」(赤い枠)を押して、新しいBaseplateを開きます。画像の赤い枠が「次に押す場所」で、画像を押すと大きく表示できます。

エクスプローラの「ServerScriptService」にマウスを乗せて、右に出る「+」(赤い枠)を押してください。ボタンの名前や置き場所は、Roblox側の更新で変わることがあります。

一覧の「Script」(赤い枠)を押して入れます。

できたScriptをエクスプローラで選んでF2キーを押し、名前を「Spinner」と入れてEnterキーを押します(赤い枠)。

RunContextは、そのスクリプトをサーバーとプレイヤーの画面のどちらで動かすかを決める設定です。エクスプローラで「Spinner」を選んだ状態で、プロパティの検索欄に「RunContext」と入力します。「▼動作」の中のRunContextの欄(最初は「Legacy」)を押し、一覧から「Server」(赤い枠)を選びます。

Spinnerのスクリプトの画面(閉じていたら、エクスプローラの「Spinner」をダブルクリックして開きます)で、中身を全部消して、次のコードを貼り付けます。
-- 重くなる例:毎フレーム、800個のパーツを1つずつ回す
local RunService = game:GetService("RunService")
local folder = Instance.new("Folder")
folder.Name = "Spinners"
folder.Parent = workspace
for i = 1, 800 do
local part = Instance.new("Part")
part.Size = Vector3.new(1, 1, 1)
part.Anchored = true
part.Position = Vector3.new((i % 40) * 2 - 40, 5 + math.floor(i / 40) * 2, -30)
part.Parent = folder
end
RunService.Heartbeat:Connect(function()
for _, part in folder:GetChildren() do
part.CFrame = part.CFrame * CFrame.Angles(0, math.rad(5), 0)
end
end)

「Heartbeat(ハートビート)」は、1秒に約60回、毎フレーム呼ばれる合図です。そのたびに800個のパーツを1つずつ回しているので、とても重い処理になります。
3D画面の上の作品のタブ「Place3」を押して3D画面に戻り、F5キーでテストを始めます(タブの名前はパソコンによって違います)。空中にたくさんの四角いパーツが並んで回ります。

1. パフォーマンスのまとめで、全体の重さを見る
テスト中に、3D画面上部メニューの「ウィンドウ」から「パフォーマンスのまとめ」(画像の1)にマウスを乗せ、出てきた一覧の「パフォーマンスのまとめ」(画像の2)を押してください。

画面の左上に、緑色の文字で数字が出ます(赤い枠)。

| 表示 | 意味 | 見るところ |
|---|---|---|
| FPS | 1秒間に画面を何回描きかえているか | 60に近いほどなめらか。大きく下がっていたら重い |
| Physics | ぶつかりや落下などの計算 | msec(ミリ秒)が大きいと重い |
| Render | 画面を描く処理 | 部品やエフェクトが多いと大きくなる |
| Network receive | サーバーから届くデータ | 動く部品が多いと大きくなる |
2. MicroProfilerで、1フレームの中身を見る
テスト中にCtrl+F6キーを押すと、画面の上に「MicroProfiler(マイクロプロファイラー)」の帯が出ます(赤い枠)。ウィンドウメニューの「パフォーマンスのまとめ」の一覧の「MicroProfiler」からも開けます。一覧にはCtrl+Alt+F6と書かれていますが、テスト中の画面ではCtrl+F6キーでも開きました。

帯の右上の「Time」「Avg」「Max」(赤い枠)は、1フレームにかかった時間(ミリ秒)です。1秒に60回描くには、1フレームを約16.7ミリ秒以内に終える必要があります。帯の棒が高いほど、そのフレームに時間がかかっています。棒の色は重さではなく、どの種類の処理に時間がかかったかを表します。もう一度Ctrl+F6キーを押せば消せます。

3. 開発者コンソールで、どのスクリプトが重いかを見る
テスト中にF9キーを押すと、「Developer Console(開発者コンソール)」が開きます。

左上の「Log」(画像の1)を押すと、見られる項目の一覧が出ます。「Scripts」(画像の2)を押します。

動いているスクリプトの一覧が出ます。「Spinner」の行を見ると、「Activity(%)」が18.066、「Rate(/s)」が60.000になっています(赤い枠)。左上の緑の数字は、手順1で開いた「パフォーマンスのまとめ」の表示です。

| 項目 | 意味 |
|---|---|
| Activity(%) | そのスクリプトが処理に使っている時間の割合。大きいほど重い |
| Rate(/s) | 1秒間に何回動いているか |
Spinnerは、1秒に60回、毎回800個を回しているので、ほかのスクリプトより飛び抜けて重いことが分かりました。
4. 1つだけ直して、同じ方法で測り直す
Shift + F5キーでテストを停止します。
回し方を「毎フレーム」から「0.2秒ごと」に変えます。0.2秒ごとにまとめて20度ずつ回すので、回る速さは直す前のおよそ3分の1になります。ここでは重さがどう変わるかを見るのが目的です。コードの変更箇所は、Spinnerの「RunService.Heartbeat」の部分を書きかえています。1行目のコメント(「–」で始まる説明の行)も書きかえていますが、コメントは動きに関係しません。
Spinnerの画面で、中身を全部消して、次のコードを貼り付けます。
-- 800個のパーツを回す(直したあと)
local RunService = game:GetService("RunService")
local folder = Instance.new("Folder")
folder.Name = "Spinners"
folder.Parent = workspace
for i = 1, 800 do
local part = Instance.new("Part")
part.Size = Vector3.new(1, 1, 1)
part.Anchored = true
part.Position = Vector3.new((i % 40) * 2 - 40, 5 + math.floor(i / 40) * 2, -30)
part.Parent = folder
end
-- 直した例:毎フレームではなく、0.2秒ごとにまとめて回す
while true do
for _, part in folder:GetChildren() do
part.CFrame = part.CFrame * CFrame.Angles(0, math.rad(20), 0)
end
task.wait(0.2)
end

3D画面の上の作品のタブ「Place3」を押して3D画面に戻り、F5キーでテストを始めます(タブの名前はパソコンによって違います)。F9キーを押して開発者コンソールを開き、左上の「Log」を押して、一覧の「Scripts」を押します。Spinnerの「Activity」が1.367、「Rate」が4.000に下がりました(赤い枠)。

以下は、アソビシフト編集部が撮影したパソコンで、直す前と後を同じ方法で確かめた結果です。
| 直す前 | 直した後 | |
|---|---|---|
| 回し方 | 毎フレーム | 0.2秒ごと |
| Activity | 18.066% | 1.367% |
| Rate | 60.000/s | 4.000/s |
毎フレーム動かす必要のない処理を、間をあけて動かすだけで、重さは大きく下がります。数字はパソコンによって変わりますが、直す前と後を同じ方法で比べることが大切です。
よくある重くなる原因
| 原因 | 確かめ方 | 直し方の例 |
|---|---|---|
| 毎フレーム動く処理が多い | 開発者コンソールのScriptsでRateが60のもの | 間をあけて動かす。変化があったときだけ動かす |
| 部品が多すぎる | 見えない場所や遠くに細かい部品がないか | まとめられる部品はまとめる。見えないものは消す |
| 動く部品が多い | パフォーマンスのまとめのNetwork receive | 動かす必要のない部品は固定する(エクスプローラでその部品を選んだ状態で、プロパティの検索欄に「Anchored」と入力し、チェックを入れる) |
| エフェクトや光が多い | パフォーマンスのまとめのRender | 数を減らす。同時に出さない |
| 影を作る部品が多い | 小さな部品や遠くの部品も影を作っていないか | 影が目立たない部品は、プロパティのCastShadowのチェックを外す。影の見た目が乱れることがある(Robloxの公式の説明にある注意) |
| 形の細かいメッシュ(ほかのソフトで作った形の部品)やユニオン(複数の部品をくっつけて1つにした形)が多い | MeshPartやユニオンのCollisionFidelity(当たり判定の細かさを決める設定) | 小さくて固定した物は、CollisionFidelityを「Box」にすると当たり判定が軽くなる(普通のPartにはこの欄はない) |
AIに相談するときの伝え方
AIに相談するときは、測った数字と条件を一緒に伝えます。
Roblox Studioで作ったゲームが重いです。原因を一緒に絞り込みたいです。
・重くなる場面:(例)テスト開始直後から
・端末:(例)Windowsのパソコン
・開発者コンソールのScriptsで重いもの:(例)Spinner、Activity 18%、Rate 60/s
・そのスクリプトのコード:(ここに貼る)
見た目を変えずに軽くする方法を1つずつ示し、直した後に何を測ればよいか教えてください。
よくある質問
スマホで重いかどうかも調べられる?
Studioのデバイスシミュレータ(スマホなどの画面の大きさを再現する機能)で確かめられるのは見た目までで、スマホでの重さは分かりません。スマホでの重さは、公開してから実際のスマホで遊んで確かめるのが確実です。公開の方法はゲームを公開する方法で解説しています。
数字はいくつなら合格?
決まった合格ラインはありません。FPSが60近くを保てているのが1つの目安です。ただし、平均が60でも時々1フレームだけ大きく遅れると、カクッと止まったように感じます。MicroProfilerの帯に、飛び抜けて高い棒がないかも見ます。大事なのは、直す前と後を同じ条件で比べて、本当に軽くなったかを確かめることです。
次は、敵が道を歩き、タワーが撃つタワーディフェンスを作ります。次のステップ(中級 18/28)
次に知りたいことを選ぶ
- 次のステップ:敵が道を歩き、タワーが撃つタワーディフェンスを作ります → ロブロックス(Roblox)スタジオでタワーディフェンスを作る方法【前編】
- 作ったゲームを友達に遊んでもらいたい → ロブロックス(Roblox)のゲームを公開する方法
- スクリプトの基本を知りたい → ロブロックス(Roblox)スクリプトの作り方
- Studioの操作で困っている → Robloxで困ったとき