前提
- EditorWindowでポーリングがしたかった
- 特定のファイルを監視し、変化があったら何かする
- EditorWindow.Update() は呼び出し間隔が良くわからない
- Called multiple times per second on all visible windows. って。。。
- EditorWindow.OnInspectorUpdate() は10fpsって明言されてるぞ
- あれ?呼び出されない条件がある。。。
調べてみた
- というわけで、調べてみた
TestWin.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class TestWin : EditorWindow {
[MenuItem("Window/TestWin")]
static void Init()
{
TestWin window = (TestWin)EditorWindow.GetWindow(typeof(TestWin));
window.Show();
}
private double[] ilog;
void DumpFps(string label)
{
if (ilog == null || ilog.Length <= 1)
{
ilog = new double[10];
}
if (ilog.Length > 1)
{
double total = 0;
ilog[ilog.Length - 1] = EditorApplication.timeSinceStartup;
for (var i = 0; i < ilog.Length - 1; i++)
{
total += ilog[i + 1] - ilog[i];
ilog[i] = ilog[i + 1];
}
Debug.LogFormat("{0}:{1}:{2}", System.DateTimeOffset.Now.ToString(), label, 1 / (total / (ilog.Length - 1)));
}
}
private bool _onIns = true;
private bool _onUpdate = false;
private void OnGUI()
{
_onIns = GUILayout.Toggle(_onIns, "OnInspectorUpdate");
_onIns = !GUILayout.Toggle(!_onIns, "Update");
_onUpdate = !_onIns;
}
/// <summary>
/// およそ6.5FPSで安定(2017.4.37)
/// バックグラウンドになると止まる
/// 画面がロックされていても止まる
/// </summary>
private void OnInspectorUpdate()
{
if (_onIns) DumpFps("OnInspectorUpdate");
}
/// <summary>
/// 環境で可変。150だったり250だったり
/// バックグラウンドになると10前後に落ちる
/// 画面がロックされていても反応する
/// </summary>
void Update () {
if (_onUpdate) DumpFps("Update");
}
}
- これを、Assets/Editor以下に作成して、Window/TestWinで起動
結果
FPS | 特徴 | 確認したVer | |
---|---|---|---|
Update() | 150-250 | 常に動く。フォアグランド状態では激しく動く | 2017.4.37 |
Update() | 10 | バックグラウンドや、画面ロックの場合FPSが下がる | 2017.4.37 |
OnInspectorUpdate() | 6.5 | フォアグランド以外では停止する | 2017.4.37 |
結論
- 私の用途だと、Update()が良い
- ただ、250fpsはちょっと多すぎなので、EditorApplication.timeSinceStartupを利用して1fpsにしてポーリングすることにした