• 内存管理


    资源载入方式有三种
    1. 静态引用
         建一个public的变量,在Inspector里把prefab拉上去。用的时候instantiate

    2. 何卸载Resources.Load()方式载入的资源。(Load以后instantiate)
    Object obj = Resources.Load("MyPrefab");
    GameObject instance = Instantiate(obj) as GameObject;
    ....
    ....
    Destroy(instance); // 销毁了一个Prefab实例。这时候 MyPrefab已经没有被实际的物体引用了
    obj  = null; // 让变量obj不再引用MyPrefab
    Resources.UnloadUnusedAssets();//释放已经没有引用的Asset

    3. 怎样卸载AssetBundle.Load()方式载入的资源,(Load以后instantiate)
    AssetBundle AssetBundle1 = AssetBundle.CreateFromFile("1.unity3d");//存放于“镜像内存”中
    obj1.renderer.material.mainTexture = AssetBundle1.Load("wall") as Texture;//存放于“主内存”中
    // obj2与obj1指向同一个Texture Asset
    obj2.renderer.material.mainTexture = obj1.renderer.material.mainTexture;
    假设AssetBundle1.Unload(true);那obj1和obj2都变成黑的了。由于指向的Texture Asset没了
    // 关闭AssetBundle但没有摧毁创建的对象和引用
    假设AssetBundle.Unload(false); 那obj1和obj2不变,仅仅是释放AssetBundle1的内存镜像
    ....
    ....
    Destroy(obj1)。//obj1被释放,但并不会释放刚才Load的Texture
    Resources.UnloadUnusedAssets();//不会有不论什么内存释放 由于Texture asset还被obj2用着
    Destroy(obj2);//obj2被释放,但也不会释放刚才Load的Texture
    Resources.UnloadUnusedAssets();//这时候刚才load的Texture Asset释放了,由于没有不论什么引用了
    GC.Collect(); // 强制马上释放内存

    用AssetBundle载入的asset一样能够用Resources.UnloadUnusedAssets卸载。但必须先AssetBundle.Unload,才会被识别为没用的asset

    4. 场景切换
        自己主动销毁:
          a. 全部的内存对象都会被自己主动销毁,包含你用AssetBundle.Load载入的对象和Instaniate克隆的。
          b. Unity在一个场景開始时。依据场景构成和引用关系所自己主动读取的资源。仅仅有在读取一个新的场景或者reset当前场景时,才会得到清理。


          不自己主动销毁:
          a. AssetBundle文件自身的内存镜像,那个必需要用Unload来释放,用.net的术语。这样的数据缓存是非托管的。

          b. 在场景之间被保持的脚本(通常这些脚本所挂载的GameObject,作为了DontDestroyOnLoad函数的參数。即被其标识为场景切换时不失效),且这些脚本非常可能含有对其它物体的Component或者资源的引用。这些资源就都得不到释放。
        c. static的单例(singleton)在场景切换时也不会被摧毁,假设这样的单例含有大量的对资源的引用。也会成为大问题。

    5. aLoad的是Asset。 销毁时:Load的Asset要Unload
         b.  Instantiate的是GameObject和Object in Scene,销毁时: Instantiate的或者new的object能够Destroy
         c.  Texture载入以后是到内存。显示的时候才进入显存的Texture Memory
        

    总结:
    三种载入方式的差别:
    静态引用 + Resouces.load()
    引用对象texture是在instantiate时载入, 第一次instantiate时会包括载入引用 assets的操作。导致第一次载入的延迟
    assetBundle.Load()
    会把perfab的所有assets 都载入,instantiate时仅仅是生成Clone

    a. Destroy: 主要用于销毁克隆对象,也能够用于场景内的静态物体,不会自己主动释放该对象的全部引用。尽管也能够用于Asset,可是概念不一样要小心。假设用于销毁从文 件载入的Asset对象会销毁对应的资源文件。可是假设销毁的Asset是Copy的或者用脚本动态生成的。仅仅会销毁内存对象。
        Load出来的Assets事实上就是个数据源,用于生成新对象或者被引用,生成的过程可能是复制(clone)也可能是引用(指针)
       当你Destroy一个实例时,仅仅是释放那些Clone(复制)对象,并不会释放引用对象和Clone的数据源对象。Destroy并不知道是否还有别的object在引用那些对象。

        等到没有不论什么 游戏场景物体在用这些Assets以后,这些assets就成了没有引用的游离数据块了,是UnusedAssets了,这时候就能够通过 R
  • 相关阅读:
    现代软件工程的构建之法
    How do I Check for Duplicate Items in a ListView?
    (转)aspxgridview记录的批量修改
    vs2010简体中文旗舰版智能感知,中文提示,英文提示变化的问题
    (转)怎样成为一名Android开发者
    It’s Not Too Late to Learn How to Code
    (转)手机屏幕VGA QVGA HVGA WVGA区别
    (转)CodeSmithSchemaExplorer类结构详细介绍
    (转)C#控件命名规范
    DataReader 绑定DataGridView的方式
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6993001.html
Copyright © 2020-2023  润新知