我有一个非常强大的大型3D世界/环境
我已分成了1000 x 1000 m(1公里)的瓷砖。
所有图块的资产捆绑包,目前只有5个资产捆绑包(预计将显着增长,可能约为1000 资产捆绑包。)
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();
}
并且对于销毁(实际上将对象作为销毁来停用对象是昂贵的功能)
代码运行正常,我能够加载/卸载资产捆绑包,但问题是
它的性能不好(预计循环会增长)。
Webgl有时笨拙,并且运行不流畅或无法顺利运行。
有人可以帮我写出更有效,更优雅的方式来加载/卸载资产包吗?
答案 0 :(得分:2)
首先,您应该查看分析器并查看应用程序的阻塞点,如果它卡在加载包中(协程仍在主线程上运行并可能导致滞后),则可能要使用{{3 }}。但是您可能想提前打电话给那些人(当玩家靠近另一个块时,因此当他实际到达该块时就已经准备好了)。 如果瓶颈处在其他位置,例如与渲染相关的操作,您可能会采用其他方式(较小的资产/较少的顶点/三角形或更具侵略性的剔除)。无论哪种方法,您都需要找到问题所在,但从第一眼看,似乎在主线程上加载资产是问题所在。