Unity

Resources.LoadのBestPracticesの検証(1,ロードとアンロード

今回のUnityバージョン

Unity 2018.3.5f1


https://unity3d.com/jp/learn/tutorials/topics/best-practices/resources-folder

Unity公式のチュートリアルより要約

・最善の方法は使わないこと

・メモリ管理が困難になる

・アセットの管理が非常に難しくなる

・配信機能の低下

・プロトタイプを迅速に制作するには優れているが、製品版では排除する必要がある

・リソースフォルダ以下のAssetはシリアライズされる

次の場合は便利に使える

・プロジェクトの存続期間を通して一般的に必要

・メモリ集約型ではない

・パッチを適用する傾向がない、またはプラットフォームやデバイス間で差がない

・最小限のブートストラップに使用

とあるがなにより

・最善の方法は使わないこと

とはどういうことなのか?

簡単に下記ソースコードを書いて検証してみた


ResourcesLoader.cs

using System.Collections;

using UnityEngine;

public class ResourcesLoader : MonoBehaviour
{
protected System.Type LoadObjectType;

[SerializeField, Header("ResourcesLoadのPathを指定")]
private string ResourcesLoadPath;

private UnityEngine.Object Asset;

private void Awake()
{
SetLoadObjectType();
}

private IEnumerator Start()
{
var request = Resources.LoadAsync(ResourcesLoadPath, LoadObjectType);

yield return request;

Asset = request.asset;
OnLoadComplete(Asset);
}

private void OnDestroy()
{
if (Asset != null)
{
Resources.UnloadAsset(Asset);
Asset = null;
}
}

protected virtual void SetLoadObjectType()
{
LoadObjectType = typeof(Object);
}

protected virtual void OnLoadComplete(Object _object)
{
;
}
}


ざっくりどんな挙動をするかというと

1.GameObjectが生成されたらResourcesLoadPathに設定されているPathでリソースの非同期読み込みを行う

2.ロードが完了したらOnLoadCompleteが呼ばれる

3.GameObjectが削除されたらResources.UnloadAssetを呼ぶ

で検証の前にカメラだけがあるSceneにおいてAssetがどうなってるか

ProfilerでMemoryの項目をDetailed表示でAssetのSampleを取っておく

before.png

適当にGameObjectを作ってAddComponentし、test.pngを読み込んだのが

load.png

PrefabやらTransformやらMonoBehaviourなど増えているがLoadに関係するもののみ開いておく

そしてGameObjectを削除したら

unload.png

画像データのロードにおいてはSprite情報は解放されず

Texture本体のみ解放されてしまったように見える。

ソースコードではリソースのAssetを読んで消したから関連するものは

消したつもりだったが完全に消し去ることはできなかったようだ。

続く