0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Unity】EditorWindowのUpdate()とOnInspectorUpdate()の使い分け

Posted at

前提

  • 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にしてポーリングすることにした

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?