【Unity】アセットインポートパイプラインv2によりSwitch Platformはどれだけ早くなったのか

アセットインポートパイプラインv2によりSwitch Platformがどれだけ早くなったのか検証しました。

Unity2019.4.1

アセットインポートパイプライン?

アセットインポートパイプラインとはテクスチャを各プラットフォームの圧縮形式に変換したりといったインポート時の処理を担う機能です。
Unity2019.3からこのアセットインポートパイプラインの大幅なアップデートバージョンであるv2がデフォルトで適用されるようになりました。

blogs.unity3d.com

このアセットインポートパイプラインの切り替えはProject Settings > Editorから行えます。

f:id:halya_11:20200619104507p:plain
アセットインポートパイプラインの切り替え

大きく変わった点として、各プラットフォーム用にアセットをコンバートした結果がキャッシュされる点があります。
例えばiOSではテクスチャをASTC形式で、AndroidではETC形式で扱う設定にしているとします。
従来のパイプラインではプラットフォームを切り替えるたびに各型式のテクスチャを同じファイル名で上書きで生成していました。

f:id:halya_11:20200726233604p:plain
コンバート結果を上書き

これに対して新しいパイプラインでは各プラットフォーム毎の生成結果が別のファイルとして生成されます。

f:id:halya_11:20200726233641p:plain
プラットフォームごとのコンバート結果

生成結果が上書きされないので、二回目以降のプラットフォーム切り替え時にはすでに生成された結果を使うことができます。

本記事では実際にこれでどれくらいプラットフォーム切り替え速度が変わるのかを検証します。

検証方法

検証方法として、まずは検証用のテクスチャを用意しておきます。
適当に1024 * 1024のpngを100枚生成しておきます。

using System.IO;
using UnityEditor;
using UnityEngine;

public class AssetDatabaseTest
{
    [MenuItem("Assets/Asset Database Test/Create Textures")]
    public static void CreateTextures()
    {
        const int textureSize = 1024;

        var directory = Path.Combine("Assets", "Textures");
        if (!Directory.Exists(directory))
        {
            Directory.CreateDirectory(directory);
        }
        
        var colors = new Color[textureSize * textureSize];
        for (var i = 0; i < textureSize * textureSize; i++)
        {
            colors[i] = Random.ColorHSV();
        }
        
        for (var i = 0; i < 100; i++)
        {
            var texture = new Texture2D(textureSize, textureSize);
            texture.SetPixels(colors);
            var path = Path.Combine(directory, $"Test{i:0000}.png");
            File.WriteAllBytes(path, texture.EncodeToPNG());
        }
        AssetDatabase.Refresh();
    }
}

テクスチャを生成したら実際にプラットフォームを切り替えつつ時間を計測します。

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

public class AssetDatabaseTest
{
    [MenuItem("Assets/Asset Database Test/Switch Platform iOS")]
    private static void SwitchPlatformIos()
    {
        SwitchPlatform(BuildTarget.iOS);
    }
    
    [MenuItem("Assets/Asset Database Test/Switch Platform Android")]
    private static void SwitchPlatformAndroid()
    {
        SwitchPlatform(BuildTarget.Android);
    }
    
    public static void SwitchPlatform(BuildTarget target)
    {
        var sw = new Stopwatch();
        sw.Start();
        EditorUserBuildSettings.SwitchActiveBuildTarget(target);
        Debug.Log(sw.Elapsed);
    }
}

計測はiOSからAndroidに切り替える時間を1回目(キャッシュなし)、2回目(キャッシュあり)に分けて行います。
またこれをアセットインポートパイプラインv1とv2の両方について検証します。

結果

測定結果は以下の通りです。

バージョン 回数 時間
v1 1回目 00:01:26.9964149
v1 2回目 00:01:27.4516955
v2 1回目 00:01:26:5578332
v2 2回目 00:00:00.6730088

v1は2回目も1回目と同じくらいの時間が掛かっているのに対し、
v2は二回目以降とても速くなっていることが確認できました。

参考

blogs.unity3d.com

https://www.youtube.com/watch?v=Bsn6a91Eqwo&feature=emb_logo