tuyoogame / YooAsset

unity3d resources management system
https://www.yooasset.com/
Apache License 2.0
2.24k stars 444 forks source link

当异步加载大量原生资源时,由于异步耗时太多导致无法执行后续加入的异步操作 #313

Open absences opened 2 weeks ago

absences commented 2 weeks ago

目前是有200多个,几kb的原生资源。 在webgl上,加载时从远端下载操作,

几百个BundledRawFileProvider等待RawFile下载校验完成, 在FileDownloader 中,走到了VerifyTempFile这一步,校验操作VerifyTempFileOperation加入异步执行列表_operations中, 由于前面的BundledRawFileProvider大量操作占用时间长,导致IsBusy为true,打断了异步执行, VerifyTempFileOperation将永不可能执行, BundledRawFileProvider一直在等待bundle done,从而卡死。

也就是说在一些性能较差的情况下,异步系统将无法正常执行 异步操作时间切片也不可能每次都能完美契合实际设备性能

absences commented 2 weeks ago

我的做法是分段加载

const int perNum = 50; //同时下载的个数

public async UniTask<RawFileHandle[]> LoadRawFileByTags(string[] tags)
{
    var infos = package.GetAssetInfos(tags);
    RawFileHandle[] handles = new RawFileHandle[infos.Length];
    int finish = 0;
    for (int i = 0; i < infos.Length; i++)
    {
        var handle = package.LoadRawFileAsync(infos[i]);
        handles[i] = handle;
        handle.Completed += (_) => finish++;
        if ((i + 1) % perNum == 0)
        {
            await UniTask.WaitUntil(() => finish == perNum);
            finish = 0;
        }
    }
    await UniTask.WaitUntil(() => finish == infos.Length % perNum);
    return handles;
}