Если префаб настолько велик, может быть, просто ваше устройство не способно отобразить его в нужном вам f / s.
Также возможно, что лаги возникают не из самой модели, а из-за инициализации (Awake
, OnEnable
) вызовов компонентов, прикрепленных к этому объекту.
Если при создании экземпляра происходит только медленно, вы должны использовать Instantiate()
только один раз в Awake
или Start
и только отключать / включать объекты, когда они не нужны, через SetActive
(каким-то образом какой объект пул делает).
Если задействовано больше сцен, вы должны использовать DontDestroyOnLoad
, чтобы перенести их на другие сцены.
Вы можете попробовать что-то вроде
async Task LoadModelAsync()
{
var assetBundle = await GetAssetBundle("www.my-server.com/myfile");
var prefab = await assetBundle.LoadAssetAsync<GameObject>("myasset");
GameObject.Instantiate(prefab);
assetBundle.Unload(false);
}
async Task<AssetBundle> GetAssetBundle(string url)
{
return (await new WWW(url)).assetBundle;
}
(см. Как использовать Async-await в Unity3d - только если им не хватает ;
после (await new WWW(url)).assetBundle
)
и используйте его, например,
private void Awake()
{
InstantiateAsync();
}
async void InstantiateAsync()
{
// Example of long running code.
await LoadModelAsync();
}
(см. здесь для еще лучших решений ). Но имейте в виду, что объект не будет их сразу же, а будет создан позже.
Или вы можете войти в новую Unity Job System , которая кажется еще быстрее ( заявлено здесь )