【发布时间】:2019-08-03 04:02:49
【问题描述】:
我正在尝试在 Unity 3D 中加载包含一些大型资产的关卡,但在加载内容时我无法摆脱卡顿和滞后。
我将我的主要场景划分为单独的子级别,并且异步加载它们。
所以首先我尝试从资源文件夹中预加载实际资产:
private IEnumerator preLoadAsset(string assetPath)
{
ResourceRequest asyncLoad = Resources.LoadAsync(assetPath);
yield return asyncLoad;
asyncLoadedAssetsCount += 1;
preloadSceneAssets();
}
这一步完成速度很快,对性能的影响很小。
private IEnumerator LoadYourAsyncScene(string sceneName)
{
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
asyncLoad.allowSceneActivation = true;
yield return asyncLoad;
asyncLoadedScenesCount += 1;
loadAdditiveScenes();
}
无论我将场景激活设置为真还是假,大多数滞后都发生在这里。
我还在脚本前面将应用的后台加载优先级设置为低:
Application.backgroundLoadingPriority = ThreadPriority.Low;
我做错了什么? 它甚至有助于在加载附加场景之前预加载资产,如果没有,我如何有效地利用内存中资产的预加载?
注意:附加场景是空的,每个场景中只有一个大资产,并且没有执行启动/OnEnable/Awake 函数
【问题讨论】:
-
不确定这个答案有多正确,但我在这里找到了这个确切的问答:gamedev.stackexchange.com/questions/130180/…
-
你应该进入async / await而不是协程,因为协程只是一种“假”异步,但仍然在同一个线程上运行。
-
@derHugo 那里的问题似乎无法从主线程外部从 Unity API 调用任何内容(如场景加载)。
UnityException: LoadAsyncInternal can only be called from the main thread.- 此外,在主线程中使用 async/await 实际上比以前使用协程时冻结了更多应用程序的执行