实例化2mb预制需要花费很长时间并且落后于游戏

时间:2019-01-17 07:00:05

标签: unity3d

使用2MB方法实例化预制件时,它会滞后于我的游戏。

我还尝试了对象池和assetBundle。

我已经使用预制件加载了4个3d模型。

我要实例化的3d模型的大小为<!DOCTYPE html> <html lang="en"> <head> <title>Bootstrap Example</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <script src="./assets/javascript/getdata.js"></script> <link rel="stylesheet" href="./assets/css/style.css"> </head> <body> <div class="page-header"> <h1>Data Table</h1> </div> <div id="ufo">ajax_response_goes_here</div> </body> </html>

1 个答案:

答案 0 :(得分:1)

如果预制件太大,也许您的设备无法以所需的f / s渲染它。

滞后也可能不是来自模型本身,而是来自初始化(AwakeOnEnable)对附加到该对象的组件的调用。


如果仅在实例化时很慢,则应仅在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;
}

(请参阅How to use Async-await in Unity3d-仅在;之后缺少(await new WWW(url)).assetBundle

并像使用它一样

private void Awake()
{
    InstantiateAsync();
}

async void InstantiateAsync()
{
    // Example of long running code.
    await LoadModelAsync();
}

(请参见here for even better solutions)。但是请记住,该对象不会马上出现,而是稍后实例化。


或者您可以使用新的Unity Job System,它似乎更快(claimed here