コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】スクリプトからアセットを編集する時は AssetDatabase.StartAssetEditing を使うと処理が速くなる

はじめに

エディタ拡張でスクリプトからマテリアルを 1,000 個作成する時に
AssetDatabase.StartAssetEditing を使う場合と使わない場合で
処理速度がどのくらい変わるか調査してみた

検証環境

  • Windows 10
  • Unity 2021.1.0f1

検証用スクリプト

AssetDatabase.StartAssetEditing を使う場合

using System.Diagnostics;
using UnityEditor;
using UnityEngine;
using Debug = UnityEngine.Debug;

public static class Example
{
    [MenuItem( "Tools/Hoge" )]
    private static void Hoge()
    {
        var stopwatch = Stopwatch.StartNew();
        var shader    = Shader.Find( "Sprites/Diffuse" );

        AssetDatabase.StartAssetEditing();

        for ( var i = 0; i < 1000; i++ )
        {
            AssetDatabase.CreateAsset( new Material( shader ), $"Assets/Materials/{i}.mat" );
        }

        AssetDatabase.StopAssetEditing();
        AssetDatabase.Refresh();

        stopwatch.Stop();

        Debug.Log( stopwatch.Elapsed.TotalSeconds );
    }
}

AssetDatabase.StartAssetEditing を使わない場合

using System.Diagnostics;
using UnityEditor;
using UnityEngine;
using Debug = UnityEngine.Debug;

public static class Example
{
    [MenuItem( "Tools/Hoge" )]
    private static void Hoge()
    {
        var stopwatch = Stopwatch.StartNew();
        var shader    = Shader.Find( "Sprites/Diffuse" );

        for ( var i = 0; i < 1000; i++ )
        {
            AssetDatabase.CreateAsset( new Material( shader ), $"Assets/Materials/{i}.mat" );
        }

        AssetDatabase.Refresh();

        stopwatch.Stop();

        Debug.Log( stopwatch.Elapsed.TotalSeconds );
    }
}

検証結果

AssetDatabase.StartAssetEditing を かかった時間
使う 6.8秒
使わない 38.3秒

AssetDatabase.StartAssetEditing を使うほうが処理が速くなる