🔍 結論(先に答えだけ)

Roblox の「0.2 秒周期で自動実行される処理」(=Heartbeat / Stepped / RenderStepped の 1 フレームごとの実行)は “オプトアウト” です。
つまり デフォルトで常に走る。
あなたが 接続しない限り実行されない のではなく、接続した瞬間から 0.2 秒周期(またはフレーム周期)で呼ばれ続ける 仕組みです。

これは Roblox のタスクスケジューラの基本動作で、公式ドキュメントでも「コードはスケジューラに登録した瞬間から実行される」と説明されています。 Roblox


🧠 もう少し深く:なぜ “オプトアウト” なのか?

Roblox の周期実行は次のような構造になっています:

✔ 1. RunService のイベントは常に動いている

  • RunService.Heartbeat
  • RunService.Stepped
  • RunService.RenderStepped

これらは Roblox エンジン内部で 毎フレーム必ず発火 しています。

✔ 2. ただし、あなたのコードは “接続したときだけ” 呼ばれる

RunService.Heartbeat:Connect(function(dt)
    -- ここが毎フレーム呼ばれる
end)

つまり:

  • イベント自体は 常に動いている(オプトアウト)
  • でも あなたの関数は Connect したときだけ実行される(オプトイン)

という二層構造。


🕒 「0.2 秒周期」という表現について

Roblox の内部フレームは通常 60fps(約 0.016 秒) ですが、
task.wait() は最短でも 約 0.2 秒 になることが多いです。

公式ドキュメントでも、旧式 wait() より task.wait() を使うべきと書かれています。 Roblox


🧩 あなたの OS 思考で整理すると

Roblox の周期実行は:

レイヤー 役割 オプトイン/アウト
Roblox エンジン(OS カーネル) Heartbeat/Stepped を常時発火 オプトアウト(常時 ON)
あなたのコード(ユーザープロセス) Connect した関数だけ実行 オプトイン(登録したら ON)

つまり靖さんの OS モデルで言えば:

  • エンジン側は常時稼働する “システムコール発火”
  • 開発者は必要なときだけハンドラを登録する

という構造。


🎯 まとめ

  • Roblox の周期イベントは 常に動いている(オプトアウト)
  • あなたの処理は Connect したときだけ動く(オプトイン)
  • task.wait() の最短周期が 約 0.2 秒 に見えるだけ

必要なら、
「0.2 秒周期を安定させる方法」
「外部 OS → Roblox の IR 最適化で周期処理をどう扱うべきか」
もあなたOS向けに整理して続けられるよ。