使用资产捆绑包在统一WebGL中进行巨大的世界装卸

时间:2019-04-08 09:26:17

标签: c# unity3d unity-webgl assetbundle

我有一个非常强大的大型3D世界/环境

  1. 我已分成了1000 x 1000 m(1公里)的瓷砖

  2. 所有图块的资产捆绑包,目前只有5个资产捆绑包(预计将显着增长,可能约为1000 资产捆绑包。)

  3. 加载/卸载这些资产束,我正在计算播放器/相机与图块之间的距离,然后要求 加载或卸载。

请参见下面的简单脚本(根据距离加载图块):

ClipRRect

函数 StartDownloadingAB 只需下载资产捆绑包并从服务器或缓存实例化游戏对象,而DestroyBundleObject停用已加载捆绑包的游戏对象(如果可用)。 以下是用于下载资产捆绑包的代码段:

        public Vector3 tileSize;
        public int maxDistance;
        public MultipleAssetBundleLoader[] tiles;

        void Start()
        {
            this.tiles  = FindObjectsOfType<MultipleAssetBundleLoader>();
        }

        void DeactivateDistantTiles()
        {
                foreach (MultipleAssetBundleLoader tile in tiles)
                {
                    Vector3 tilePosition = tile.gameObject.transform.position + (tileSize / 2f);

                    float xDistance = Mathf.Abs(tilePosition.x - playerPosition.x);
                    float zDistance = Mathf.Abs(tilePosition.z - playerPosition.z);

                    if (xDistance + zDistance > maxDistance)
                    {
                        tile.DestroyBundleObject();
                        //tile.SetActive(false);
                    }
                    else
                    {
                        tile.StartDownloadingAB();
                    }
                }  
        }

        void Update()
        {
            DeactivateDistantTiles();
        }

并且对于销毁(实际上将对象作为销毁来停用对象是昂贵的功能)

性能问题:

代码运行正常,我能够加载/卸载资产捆绑包,但问题是

  1. 它的性能不好(预计循环会增长)。

  2. Webgl有时笨拙,并且运行不流畅或无法顺利运行。

  3. 下载内容(资产捆绑包)时,即使使用LoadAssetAsync,游戏也会冻结。

有人可以帮我写出更有效,更优雅的方式来加载/卸载资产包吗?

1 个答案:

答案 0 :(得分:2)

首先,您应该查看分析器并查看应用程序的阻塞点,如果它卡在加载包中(协程仍在主线程上运行并可能导致滞后),则可能要使用{{3 }}。但是您可能想提前打电话给那些人(当玩家靠近另一个块时,因此当他实际到达该块时就已经准备好了)。 如果瓶颈处在其他位置,例如与渲染相关的操作,您可能会采用其他方式(较小的资产/较少的顶点/三角形或更具侵略性的剔除)。无论哪种方法,您都需要找到问题所在,但从第一眼看,似乎在主线程上加载资产是问题所在。