【问题标题】:Unity3D/C# - Async Loading of assets and level causes framedropUnity3D/C# - 资产和关卡的异步加载导致丢帧
【发布时间】: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 实际上比以前使用协程时冻结了更多应用程序的执行

标签: c# unity3d


【解决方案1】:

异步场景加载仅适用于从硬盘加载资产的阶段。 接下来是 Merge Prefabs,是他制造了这个问题。

来源:Profiler 数据

解决方案: 使用 GameObject.Instantiate 手动实例化预制件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2012-11-12
    • 2023-01-27
    相关资源
    最近更新 更多