Загрузка AssetBundle в Unity 3D резко снижает FPS - PullRequest
0 голосов
/ 09 октября 2018

У меня есть простое приложение, в котором используются 3D-модели, и я хочу загрузить их из AssetBundle.Я создал несколько AssetBundles для каждой категории моделей (например, автомобили, лодки, деревья ...)

Я уже сделал это, но когда я начинаю свою игру, и все модели загружаются из AssetBundleколичество FPS падает.Игра зависает до тех пор, пока не загружены все модели.

Я пытался скрыть это с открывающим видео, но даже видео застряло.

Очевидно, я не могу использовать систему Threads, потому что Unity APIне является потокобезопасным.

Мой вопрос: Есть ли лучший (более эффективный) способ загрузки активов?

Мой код:

Создание AssetBundle:

   [MenuItem("Assets/Create assetbundle")]
   static void CreateAssetBundle()
   {
    // this list of categories is read from a file, and I loop through it.
    // this is a bit older version, but the loop is the only difference...
    AssetBundleBuild carBuild = new AssetBundleBuild();
    AssetBundleBuild boatBuild = new AssetBundleBuild();
    string[] paths = AssetDatabase.GetAllAssetPaths();
    List<string> carAssets = new List<string>();
    List<string> boatAssets = new List<string>();
    foreach (var item in paths)
    {
        if (item.EndsWith(".ma") && item.StartsWith("Car")) // find all car models
        {
            carAssets.Add(item);
        }
        else if(item.EndsWith(".ma") && item.StartsWith("Boat")) // find all boat models
        {
            boatAssets.Add(item);
        }
    }
    carBuild.assetBundleName = "cars";
    carBuild.assetNames = carAssets.ToArray();
    boatBuild.assetBundleName = "boats";
    boatBuild.assetNames = boatAssets.ToArray();
    BuildPipeline.BuildAssetBundles("Assets/Test", new AssetBundleBuild[] { carBuild, boatBuild}, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
  }

Загрузка моделей:

private IEnumerator LoadAssetsBundle()
{
    yield return null;
    List<string> categories = ReadFromAFile(); // the list is being loaded from a file
           yield return null;
    foreach(var category in categories)
    {
     using(WWW loader = WWW.LoadFromCacheOrDownload(@"file://D:\Test\"+category, 1))
     {
       yield return loader;
       AssetBundle bundle = loader.assetBundle;
       var temp = bundle.LoadAllAssetsAsync();
       yield return temp;
       foreach (var item in temp.allAssets)
       {
           Instantiate(item);
           yield return null;
       }
       bundle.Unload(false);
       yield return null;
     }
    }
}

РЕДАКТИРОВАТЬ Здесь нет ни результатов, ни ответов на единство,Я думаю, что это лучший способ ...

ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ Я нашел решение, и оно отлично работало

...