スクリプト弄るモッダ―向け情報です。プロファイルはモッダ―以外には必要のない機能です。スカイリムのPapyrusには簡易的ですがプロファイル機能があります。イベントや関数の呼び出したタイミングを計測できます。
プロファイルの設定
以下のiniファイルを開きます。
[Papyrus]がある行を探します。以下のように書き加えます。(MOはMOのSkyrim.ini弄ってください)
[Papyrus] bEnableProfiling=1
書き終えたらiniを保存します。普段プロファイルしないときは0にしておいてください。
計測する
ゲームを起動します。コンソールを開き以下のコマンドを打ち込みます。
以下のファイルにプロファイリングしたデータがリアルタイムで反映されます。LogExpertみたいなリアルタイムで反映されるログビューワーを使うと追いやすいです。
ログの読み方
ログを開いて読んでみましょう。これは「TK Dodge」のキー押ししてドッジのスクリプト処理が終わるまでの一連の流れです。
左から順に、通知時間、通知種類、一連の処理順番号、謎、スクリプトの実行元、実行元のFormID、スクリプト名、謎、イベント・関数名
通知時間
最初の数字8ケタがスクリプトが実行されたミリ秒(ms)です。つまり1/1000秒。PCかゲームかどちらかの経過時間の模様。通知時間は下4ケタのみ参照すればOK。32421940なら、下4ケタは1.940秒です。
通知種類
どういう要求や通知されたかの種類が記載されます。
QUEUE_PUSH:クエリプッシュ。「プッシュして」という要求です。ここがイベントの始まり。OnKeyDownなら押したとき。
PUSH:プッシュ。イベントや関数のデータをスタックに送り込みます。
QUEUE_POP:クエリポップ。「ポップして」という要求です。
POP:ポップ。スタックからデータを取り出します。イベントや関数の処理の終わり。
- イベントはイベントに発火して動くのでクエリが必要です。逆に関数は呼び出された時点で動くのでクエリはありません。
- ポップはUtility.Wait()の影響を受けます。Waitに限らずLatent Function全般そう。
- スタックは「先入れ後出し」です。あとから入れたほうから順に取り出します。スタックしてる間はデータの位置が変わらないためデータを取扱いやすいのです。ちなみに「先入れ先出し」はキュー。
処理番号
クエリプッシュ→プッシュ→スタック→クエリポップ→ポップまでの一連の流れをひとつの番号にし、これが処理順の番号として管理されてます。
読み方の実践
例は「TK Dodge」の一連の処理です。キーを押してからドッジのスクリプト処理が終わるまでです。モーション再生までどれだけスクリプトの入力遅延があるかをテストします。
OnKeyDownのクエリプッシュからプッシュされるまでの遅延が52-40=12ms。
CanCarryは重量過多を判定する自作関数です。ポップ時間ープッシュ時間=34msロスしてます。
DoDodgeActionはドッジモーションを発動させる関数です。つまりモーション発動までのスクリプト遅延は46ms、0.046秒です。PlayIdle関数からモーションの呼び出しや描画の秒数は計測できないので、実際はもう少し時間かかります。
クエリの短縮は無理なので、重量過多判定をしなければ34msは遅延を短縮できます。これがプロファイルによって分かります。