private void UpdatePendingRequests() { if (_lockCount <= 0 && _pendingRequests.Count > 0) { var pendingIt = _pendingRequests.First; while (pendingIt != null) { if (_loadingRequestCount > _maxLoadingAssetNum) { break; } var req = pendingIt.Value; var next = pendingIt.Next; var assetInfo = req.AssetInfo; if (IsPendingReuqest(req)) { pendingIt = next; //waiting for previous identical assets loaded. continue; } if (req.IsDisposed) { _loadedRequests.Enqueue(req); } else { switch (req.RequestType) { case ELoadRequestType.Bundle: { try { _bundleLoadProfile.BeginProfileOnlyEnableProfile(); _bundlePool.LoadAssetBundle(req.AssetInfo.BundleName); } finally { _bundleLoadProfile.EndProfileOnlyEnableProfile(); } break; } case ELoadRequestType.Scene: { try { _sceneLoadProfile.BeginProfileOnlyEnableProfile(); _bundlePool.LoadScene(assetInfo.BundleName, assetInfo.AssetName, req.IsAdditiveScene); _loadingScenes.Add(assetInfo); _loadedRequests.Enqueue(req); req.IsDisposed = true; } finally { _sceneLoadProfile.EndProfileOnlyEnableProfile(); } break; } case ELoadRequestType.Asset: { try { _assetLoadProfile.BeginProfileOnlyEnableProfile(); if (TryLoadFromAssetPool(req)) { _loadedRequests.Enqueue(req); } else { _bundlePool.LoadAsset(assetInfo.BundleName, assetInfo.AssetName, req.Option.ObjectType); var node = AssetLoadRequestNode.Alloc(req); AssetLoadRequestNode cachedNode; if (_loadingRequests.TryGetValue(req.AssetInfo, out cachedNode)) { node.Next = cachedNode.Next; cachedNode.Next = node; } else { _loadingRequests[req.AssetInfo] = node; } _loadingRequestCount++; } } finally { _assetLoadProfile.EndProfileOnlyEnableProfile(); } break; } } } _pendingRequests.Remove(pendingIt); pendingIt = next; } } }